From 20397c8e67675c9f12b5c9fa7d3805b5b1d2b797 Mon Sep 17 00:00:00 2001 From: Adam Retter Date: Fri, 13 Feb 2026 19:01:57 +0100 Subject: [PATCH 1/5] [refactor] Cleanup XQuery compilation and execution calls --- exist-core/pom.xml | 30 ++ .../triggers/XQueryStartupTrigger.java | 48 +- .../collections/triggers/XQueryTrigger.java | 107 ++--- .../exist/http/AuditTrailSessionListener.java | 49 +- .../main/java/org/exist/http/RESTServer.java | 283 ++++------- .../java/org/exist/http/SessionManager.java | 46 +- .../http/servlets/RedirectorServlet.java | 45 +- .../exist/http/servlets/XQueryServlet.java | 107 ++--- .../http/urlrewrite/XQueryURLRewrite.java | 55 +-- .../java/org/exist/launcher/Launcher.java | 9 +- .../exist/management/impl/SanityReport.java | 36 +- .../main/java/org/exist/repo/Deployment.java | 58 +-- .../org/exist/scheduler/UserXQueryJob.java | 65 +-- .../java/org/exist/source/AbstractSource.java | 27 +- .../main/java/org/exist/source/Source.java | 3 +- .../storage/serializers/XIncludeFilter.java | 109 ++--- .../org/exist/test/TransactionTestDSL.java | 33 +- .../org/exist/test/XQueryCompilationTest.java | 9 +- .../exist/test/runner/AbstractTestRunner.java | 73 +-- .../util/serializer/XQuerySerializer.java | 29 ++ .../internal/DatabaseResources.java | 90 ++-- .../exist/xmldb/LocalXPathQueryService.java | 79 ++- .../java/org/exist/xmlrpc/RpcConnection.java | 8 +- .../main/java/org/exist/xquery/XQuery.java | 69 ++- .../java/org/exist/xquery/XQueryUtil.java | 237 +++++++++ .../java/org/exist/xquery/util/HTTPUtils.java | 61 ++- .../java/org/exist/xupdate/Conditional.java | 78 ++- .../java/org/exist/xupdate/Modification.java | 68 +-- .../org/exist/xupdate/XUpdateProcessor.java | 93 ++-- .../src/test/java/org/exist/Indexer2Test.java | 11 +- .../src/test/java/org/exist/Indexer3Test.java | 7 +- .../src/test/java/org/exist/IndexerTest.java | 11 +- .../triggers/XQueryTriggerSetGidTest.java | 50 +- .../triggers/XQueryTriggerSetUidTest.java | 49 +- .../org/exist/dom/memtree/DOMIndexerTest.java | 10 +- .../dom/persistent/BasicNodeSetTest.java | 98 ++-- .../org/exist/numbering/DLNStorageTest.java | 26 +- .../security/FnCollectionSecurityTest.java | 46 +- .../org/exist/security/FnDocSecurityTest.java | 19 +- .../exist/security/SecurityManagerTest.java | 42 +- .../org/exist/security/XqueryApiTest.java | 9 +- .../org/exist/storage/AbstractUpdateTest.java | 11 +- .../exist/storage/RangeIndexUpdateTest.java | 8 +- .../java/org/exist/storage/RecoveryTest.java | 8 +- .../java/org/exist/storage/ShutdownTest.java | 8 +- .../exist/storage/XIncludeSerializerTest.java | 178 +++---- .../src/test/java/org/exist/test/Util.java | 66 --- .../java/org/exist/validation/TestTools.java | 39 +- .../java/org/exist/xquery/CleanupTest.java | 7 +- .../xquery/ConstructedNodesRecoveryTest.java | 21 +- .../exist/xquery/ForwardReferenceTest.java | 22 +- .../org/exist/xquery/ImportModuleTest.java | 238 ++------- .../org/exist/xquery/JavaBindingTest.java | 452 ++++++++---------- .../org/exist/xquery/RestBinariesTest.java | 10 +- .../xquery/XQueryContextAttributesTest.java | 62 +-- .../xquery/XQueryDeclareContextItemTest.java | 71 ++- .../java/org/exist/xquery/XQueryTest.java | 61 +-- .../org/exist/xquery/XQueryUpdateTest.java | 205 ++++---- .../xquery/functions/fn/CollectionTest.java | 59 ++- .../exist/xquery/functions/fn/DocTest.java | 76 +-- .../functions/fn/FunUnparsedTextTest.java | 108 +++-- .../fn/transform/FunTransformITTest.java | 14 +- .../functions/inspect/InspectModuleTest.java | 27 +- ...ntManagementFunctionRemoveAccountTest.java | 48 +- .../AccountMetadataFunctionsTest.java | 11 +- .../securitymanager/GetPermissionsTest.java | 10 +- ...roupManagementFunctionRemoveGroupTest.java | 7 +- ...mbershipFunctionRemoveGroupMemberTest.java | 7 +- .../PermissionsFunctionChmodTest.java | 24 +- .../PermissionsFunctionChownTest.java | 307 ++++++------ .../SecurityManagerTestUtil.java | 33 +- .../functions/transform/TransformTest.java | 33 +- .../xquery/functions/util/ParseHtmlTest.java | 34 +- .../functions/xquery3/SerializeTest.java | 19 +- .../UpdateInsertTriggersDefragTest.java | 11 +- extensions/contentextraction/pom.xml | 12 - .../xquery/ContentFunctionsTest.java | 37 +- .../exist/contentextraction/xquery/Util.java | 111 ----- extensions/expath/pom.xml | 8 + .../java/org/expath/exist/HttpClientTest.java | 34 +- .../indexes/indexes-integration-tests/pom.xml | 8 + .../exist/indexing/EnforceIndexUseTest.java | 35 +- .../indexing/lucene/LuceneIndexTest.java | 415 +++++++++------- .../lucene/LuceneMatchListenerTest.java | 73 +-- .../lucene/SerializeAttrMatchesTest.java | 6 +- .../exist/indexing/ngram/CustomIndexTest.java | 86 ++-- .../indexing/ngram/MatchListenerTest.java | 166 +++---- extensions/indexes/spatial/pom.xml | 6 + .../exist/indexing/spatial/GMLIndexTest.java | 227 +++++---- extensions/modules/cache/pom.xml | 6 + .../xquery/modules/cache/LazyCacheTest.java | 11 +- .../modules/cache/NonLazyCacheTest.java | 11 +- .../expathrepo-trigger-test/pom.xml | 8 + .../org/exist/repo/ExampleModuleTest.java | 42 +- extensions/modules/expathrepo/pom.xml | 6 + .../org/exist/repo/PackageTriggerTest.java | 38 +- .../exist-expathrepo-trigger-test.xar | Bin 38303 -> 38333 bytes .../xquery/modules/file/RestBinariesTest.java | 10 +- extensions/modules/mail/pom.xml | 2 - .../xquery/modules/mail/SendEmailIT.java | 19 +- .../org/exist/xquery/modules/mail/Util.java | 111 ----- extensions/modules/sql/pom.xml | 2 + .../xquery/modules/sql/ConnectionIT.java | 4 +- .../xquery/modules/sql/ConnectionPoolIT.java | 6 +- .../exist/xquery/modules/sql/ExecuteIT.java | 56 ++- .../sql/ImplicitConnectionCloseIT.java | 5 +- .../xquery/modules/sql/JndiConnectionIT.java | 4 +- .../org/exist/xquery/modules/sql/Util.java | 53 -- extensions/modules/xslfo/pom.xml | 8 + .../xquery/modules/xslfo/ApacheFopTest.java | 43 +- extensions/security/iprange/pom.xml | 7 + .../security/realm/iprange/IPRangeRealm.java | 81 ++-- 112 files changed, 3039 insertions(+), 3395 deletions(-) create mode 100644 exist-core/src/main/java/org/exist/xquery/XQueryUtil.java delete mode 100644 extensions/contentextraction/src/test/java/org/exist/contentextraction/xquery/Util.java delete mode 100644 extensions/modules/mail/src/test/java/org/exist/xquery/modules/mail/Util.java diff --git a/exist-core/pom.xml b/exist-core/pom.xml index de72cfe9b4..15ac113db0 100644 --- a/exist-core/pom.xml +++ b/exist-core/pom.xml @@ -769,6 +769,7 @@ src/test/java/org/exist/xquery/JavaBindingTest.java src/test/java/org/exist/xquery/WatchdogTest.java src/test/java/org/exist/xquery/XPathUtilTest.java + src/main/java/org/exist/xquery/XQueryUtil.java src/main/java/org/exist/xquery/functions/fn/FunDocAvailable.java src/test/java/org/exist/xquery/functions/fn/FunXmlToJsonTest.java src/test/java/org/exist/xquery/functions/fn/ParsingFunctionsTest.java @@ -942,6 +943,7 @@ src/main/java/org/exist/http/Response.java src/main/java/org/exist/http/RESTServer.java src/test/java/org/exist/http/RESTServiceTest.java + src/main/java/org/exist/http/SessionManager.java src/main/java/org/exist/http/servlets/AbstractExistHttpServlet.java src/main/java/org/exist/http/servlets/EXistServlet.java src/main/java/org/exist/http/servlets/HttpServletRequestWrapper.java @@ -1010,11 +1012,13 @@ src/main/java/org/exist/security/EffectiveSubject.java src/main/java/org/exist/security/EXistSchemaType.java src/test/java/org/exist/security/FnDocSecurityTest.java + src/test/java/org/exist/security/FnCollectionSecurityTest.java src/main/java/org/exist/security/Permission.java src/main/java/org/exist/security/PermissionRequired.java src/main/java/org/exist/security/Principal.java src/test/java/org/exist/security/RestApiSecurityTest.java src/main/java/org/exist/security/SecurityManager.java + src/test/java/org/exist/security/SecurityManagerTest.java src/main/java/org/exist/security/SimpleACLPermissionInternal.java src/test/java/org/exist/security/SimpleACLPermissionTest.java src/main/java/org/exist/security/UnixStylePermissionInternal.java @@ -1026,6 +1030,7 @@ src/main/java/org/exist/security/internal/aider/UnixStylePermissionAider.java src/main/java/org/exist/security/management/AccountsManagement.java src/main/java/org/exist/security/management/GroupsManagement.java + src/main/java/org/exist/source/AbstractSource.java src/main/java/org/exist/source/Source.java src/main/java/org/exist/source/SourceFactory.java src/main/java/org/exist/source/URLSource.java @@ -1096,6 +1101,8 @@ src/main/java/org/exist/storage/sync/SyncTask.java src/test/java/org/exist/storage/util/PauseFunction.java src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java + src/main/java/org/exist/test/TransactionTestDSL.java + src/test/java/org/exist/test/XQueryCompilationTest.java src/main/java/org/exist/test/runner/AbstractTestRunner.java src/main/java/org/exist/test/runner/ExtTestAssumptionFailedFunction.java src/main/java/org/exist/test/runner/ExtTestErrorFunction.java @@ -1138,6 +1145,7 @@ src/test/java/org/exist/util/serializer/HTML5WriterTest.java src/main/java/org/exist/util/serializer/SAXSerializer.java src/main/java/org/exist/util/serializer/SerializerObjectFactory.java + src/main/java/org/exist/util/serializer/XQuerySerializer.java src/main/java/org/exist/util/serializer/json/JSONObject.java src/test/java/org/exist/util/serializer/json/JSONObjectTest.java src/main/java/org/exist/util/serializer/json/JSONSerializer.java @@ -1152,6 +1160,7 @@ src/test/resources/org/exist/validation/catalog.xml src/test/java/org/exist/validation/CollectionConfigurationValidationModeTest.java src/test/java/org/exist/validation/DtdEntityTest.java + src/test/java/org/exist/validation/TestTools.java src/main/java/org/exist/validation/XmlLibraryChecker.java src/main/java/org/exist/validation/internal/DatabaseResources.java src/main/resources/org/exist/validation/internal/query/find_catalogs_with_dtd.xq @@ -1255,6 +1264,7 @@ src/test/java/org/exist/xquery/XPathOpOrSpecialCaseTest.java src/test/java/org/exist/xquery/XPathQueryTest.java src/main/java/org/exist/xquery/XPathUtil.java + src/main/java/org/exist/xquery/XQuery.java src/main/java/org/exist/xquery/XQueryContext.java src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java src/test/java/org/exist/xquery/XQueryFunctionsTest.java @@ -1264,6 +1274,7 @@ src/test/java/org/exist/xquery/XQueryUpdateTest.java src/main/java/org/exist/xquery/functions/array/ArrayType.java src/test/java/org/exist/xquery/functions/fn/DocTest.java + src/test/java/org/exist/xquery/functions/fn/CollectionTest.java src/main/java/org/exist/xquery/functions/fn/ExtCollection.java src/main/java/org/exist/xquery/functions/fn/FnDefaultLanguage.java src/main/java/org/exist/xquery/functions/fn/FnFormatDates.java @@ -1359,6 +1370,7 @@ src/main/java/org/exist/xquery/functions/fn/FunTrueOrFalse.java src/main/java/org/exist/xquery/functions/fn/FunUnordered.java src/main/java/org/exist/xquery/functions/fn/FunUnparsedText.java + src/test/java/org/exist/xquery/functions/fn/FunUnparsedTextTest.java src/main/java/org/exist/xquery/functions/fn/FunUpperOrLowerCase.java src/main/java/org/exist/xquery/functions/fn/FunUriCollection.java src/main/java/org/exist/xquery/functions/fn/FunXmlToJson.java @@ -1381,6 +1393,7 @@ src/test/java/org/exist/xquery/functions/request/GetParameterTest.java src/test/java/org/exist/xquery/functions/request/PatchTest.java src/main/java/org/exist/xquery/functions/response/Stream.java + src/test/java/org/exist/xquery/functions/securitymanager/AccountManagementFunctionRemoveAccountTest.java src/test/java/org/exist/xquery/functions/securitymanager/GetPermissionsTest.java src/test/java/org/exist/xquery/functions/securitymanager/GroupManagementFunctionRemoveGroupTest.java src/test/java/org/exist/xquery/functions/securitymanager/GroupMembershipFunctionRemoveGroupMemberTest.java @@ -1405,6 +1418,7 @@ src/main/java/org/exist/xquery/functions/util/FunctionFunction.java src/main/java/org/exist/xquery/functions/util/LogFunction.java src/main/java/org/exist/xquery/functions/util/ModuleInfo.java + src/test/java/org/exist/xquery/functions/util/ParseHtmlTest.java src/test/java/org/exist/xquery/functions/validate/JaxpDtdCatalogTest.java src/test/java/org/exist/xquery/functions/validate/JaxpParseTest.java src/test/java/org/exist/xquery/functions/validate/JaxpXsdCatalogTest.java @@ -1432,6 +1446,7 @@ src/test/java/org/exist/xquery/update/UpdateReplaceTest.java src/test/java/org/exist/xquery/update/UpdateValueTest.java src/main/java/org/exist/xquery/util/ExpressionDumper.java + src/main/java/org/exist/xquery/util/HTTPUtils.java src/main/java/org/exist/xquery/util/SerializerUtils.java src/main/java/org/exist/xquery/value/AbstractDateTimeValue.java src/main/java/org/exist/xquery/value/AbstractTimeRelatedTest.java @@ -1671,6 +1686,7 @@ src/test/java/org/exist/http/RESTExternalVariableTest.java src/main/java/org/exist/http/RESTServer.java src/test/java/org/exist/http/RESTServiceTest.java + src/main/java/org/exist/http/SessionManager.java src/main/java/org/exist/http/servlets/AbstractExistHttpServlet.java src/main/java/org/exist/http/servlets/EXistServlet.java src/main/java/org/exist/http/servlets/HttpServletRequestWrapper.java @@ -1744,12 +1760,14 @@ src/main/java/org/exist/security/EffectiveSubject.java src/main/java/org/exist/security/EXistSchemaType.java src/test/java/org/exist/security/FnDocSecurityTest.java + src/test/java/org/exist/security/FnCollectionSecurityTest.java src/main/java/org/exist/security/Permission.java src/main/java/org/exist/security/PermissionRequired.java src/main/java/org/exist/security/PermissionRequiredCheck.java src/main/java/org/exist/security/Principal.java src/test/java/org/exist/security/RestApiSecurityTest.java src/main/java/org/exist/security/SecurityManager.java + src/test/java/org/exist/security/SecurityManagerTest.java src/main/java/org/exist/security/SimpleACLPermissionInternal.java src/test/java/org/exist/security/SimpleACLPermissionTest.java src/main/java/org/exist/security/UnixStylePermissionInternal.java @@ -1761,6 +1779,7 @@ src/main/java/org/exist/security/internal/aider/UnixStylePermissionAider.java src/main/java/org/exist/security/management/AccountsManagement.java src/main/java/org/exist/security/management/GroupsManagement.java + src/main/java/org/exist/source/AbstractSource.java src/main/java/org/exist/source/Source.java src/main/java/org/exist/source/SourceFactory.java src/main/java/org/exist/source/URLSource.java @@ -1887,7 +1906,9 @@ src/test/java/org/exist/storage/util/PauseFunction.java src/main/java/org/exist/test/DiffMatcher.java src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java + src/main/java/org/exist/test/TransactionTestDSL.java src/test/java/org/exist/test/Util.java + src/test/java/org/exist/test/XQueryCompilationTest.java src/main/java/org/exist/test/runner/AbstractTestRunner.java src/main/java/org/exist/test/runner/ExtTestAssumptionFailedFunction.java src/main/java/org/exist/test/runner/ExtTestErrorFunction.java @@ -1941,6 +1962,7 @@ src/main/java/org/exist/util/serializer/SAXSerializer.java src/test/java/org/exist/util/serializer/SAXSerializerTest.java src/main/java/org/exist/util/serializer/SerializerObjectFactory.java + src/main/java/org/exist/util/serializer/XQuerySerializer.java src/main/java/org/exist/util/serializer/json/JSONObject.java src/test/java/org/exist/util/serializer/json/JSONObjectTest.java src/main/java/org/exist/util/serializer/json/JSONSerializer.java @@ -1955,6 +1977,7 @@ src/test/resources/org/exist/validation/catalog.xml src/test/java/org/exist/validation/CollectionConfigurationValidationModeTest.java src/test/java/org/exist/validation/DtdEntityTest.java + src/test/java/org/exist/validation/TestTools.java src/main/java/org/exist/validation/XmlLibraryChecker.java src/main/java/org/exist/validation/internal/DatabaseResources.java src/main/resources/org/exist/validation/internal/query/find_catalogs_with_dtd.xq @@ -2076,6 +2099,7 @@ src/test/java/org/exist/xquery/XPathQueryTest.java src/main/java/org/exist/xquery/XPathUtil.java src/test/java/org/exist/xquery/XPathUtilTest.java + src/main/java/org/exist/xquery/XQuery.java src/main/java/org/exist/xquery/XQueryContext.java src/test/java/org/exist/xquery/XQueryContextAttributesTest.java src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java @@ -2084,8 +2108,10 @@ src/test/java/org/exist/xquery/XQueryProcessingInstructionTest.java src/test/java/org/exist/xquery/XQueryTest.java src/test/java/org/exist/xquery/XQueryUpdateTest.java + src/main/java/org/exist/xquery/XQueryUtil.java src/main/java/org/exist/xquery/functions/array/ArrayType.java src/test/java/org/exist/xquery/functions/fn/DocTest.java + src/test/java/org/exist/xquery/functions/fn/CollectionTest.java src/main/java/org/exist/xquery/functions/fn/ExtCollection.java src/main/java/org/exist/xquery/functions/fn/FnDefaultLanguage.java src/main/java/org/exist/xquery/functions/fn/FnFormatDates.java @@ -2182,6 +2208,7 @@ src/main/java/org/exist/xquery/functions/fn/FunTrueOrFalse.java src/main/java/org/exist/xquery/functions/fn/FunUnordered.java src/main/java/org/exist/xquery/functions/fn/FunUnparsedText.java + src/test/java/org/exist/xquery/functions/fn/FunUnparsedTextTest.java src/main/java/org/exist/xquery/functions/fn/FunUpperOrLowerCase.java src/main/java/org/exist/xquery/functions/fn/FunUriCollection.java src/main/java/org/exist/xquery/functions/fn/FunXmlToJson.java @@ -2209,6 +2236,7 @@ src/test/java/org/exist/xquery/functions/request/GetParameterTest.java src/test/java/org/exist/xquery/functions/request/PatchTest.java src/main/java/org/exist/xquery/functions/response/Stream.java + src/test/java/org/exist/xquery/functions/securitymanager/AccountManagementFunctionRemoveAccountTest.java src/test/java/org/exist/xquery/functions/securitymanager/AccountMetadataFunctionsTest.java src/test/java/org/exist/xquery/functions/securitymanager/GetPermissionsTest.java src/test/java/org/exist/xquery/functions/securitymanager/GroupManagementFunctionRemoveGroupTest.java @@ -2239,6 +2267,7 @@ src/main/java/org/exist/xquery/functions/util/FunctionFunction.java src/main/java/org/exist/xquery/functions/util/LogFunction.java src/main/java/org/exist/xquery/functions/util/ModuleInfo.java + src/test/java/org/exist/xquery/functions/util/ParseHtmlTest.java src/test/java/org/exist/xquery/functions/validate/JaxpDtdCatalogTest.java src/test/java/org/exist/xquery/functions/validate/JaxpParseTest.java src/test/java/org/exist/xquery/functions/validate/JaxpXsdCatalogTest.java @@ -2271,6 +2300,7 @@ src/test/java/org/exist/xquery/update/UpdateReplaceTest.java src/test/java/org/exist/xquery/update/UpdateValueTest.java src/main/java/org/exist/xquery/util/ExpressionDumper.java + src/main/java/org/exist/xquery/util/HTTPUtils.java src/main/java/org/exist/xquery/util/SerializerUtils.java src/test/java/org/exist/xquery/util/URIUtilsTest.java src/main/java/org/exist/xquery/value/AbstractDateTimeValue.java diff --git a/exist-core/src/main/java/org/exist/collections/triggers/XQueryStartupTrigger.java b/exist-core/src/main/java/org/exist/collections/triggers/XQueryStartupTrigger.java index 5c7d909028..12dd1141e8 100644 --- a/exist-core/src/main/java/org/exist/collections/triggers/XQueryStartupTrigger.java +++ b/exist-core/src/main/java/org/exist/collections/triggers/XQueryStartupTrigger.java @@ -47,6 +47,7 @@ import java.util.*; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.collections.Collection; @@ -63,10 +64,9 @@ import org.exist.storage.txn.TransactionManager; import org.exist.storage.txn.Txn; import org.exist.xmldb.XmldbURI; -import org.exist.xquery.CompiledXQuery; -import org.exist.xquery.XQuery; +import org.exist.xquery.XPathException; import org.exist.xquery.XQueryContext; -import org.exist.xquery.value.Sequence; +import org.exist.xquery.XQueryUtil; import xyz.elemental.mediatype.MediaType; import static org.exist.util.StringUtil.endsWith; @@ -266,49 +266,31 @@ private List getParameters(Map> params) { * @param broker eXist database broker * @param path path to query, formatted as xmldb:exist:///db/... */ - private void executeQuery(DBBroker broker, String path) { - - XQueryContext context = null; + private void executeQuery(final DBBroker broker, final String path) { try { // Get path to xquery - Source source = SourceFactory.getSource(broker, null, path, false); + final Source source = SourceFactory.getSource(broker, null, path, false); if (source == null) { - LOG.info("No XQuery found at '{}'", path); + LOG.warn("No XQuery found at '{}'", path); } else { - // Setup xquery service - XQuery service = broker.getBrokerPool().getXQueryService(); - context = new XQueryContext(broker.getBrokerPool()); - - // Allow use of modules with relative paths - String moduleLoadPath = substringBeforeLast(path, "/"); - context.setModuleLoadPath(moduleLoadPath); - - // Compile query - CompiledXQuery compiledQuery = service.compile(context, source); - - LOG.info("Starting XQuery at '{}'", path); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + // Allow use of modules with relative paths + final String moduleLoadPath = substringBeforeLast(path, "/"); + xqueryContext.setModuleLoadPath(moduleLoadPath); + }; - // Finish preparation - context.prepareForExecution(); + LOG.info("Executing XQuery Startup Trigger: {}", path); - // Execute - Sequence result = service.execute(broker, compiledQuery, null); - - // Log results - LOG.info("Result XQuery: '{}'", result.getStringValue()); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, setupXqueryContextPreCompilation, null, null); + LOG.info("Executed XQuery Startup Trigger: {} in {}", path, queryResult.executionTime); } - } catch (Throwable t) { + } catch (final Throwable t) { // Dirty, catch it all LOG.error("An error occurred during preparation/execution of the XQuery script {}: {}", path, t.getMessage(), t); - - } finally { - if (context != null) { - context.runCleanupTasks(); - } } } diff --git a/exist-core/src/main/java/org/exist/collections/triggers/XQueryTrigger.java b/exist-core/src/main/java/org/exist/collections/triggers/XQueryTrigger.java index 4ca09b7e63..20550f8acd 100644 --- a/exist-core/src/main/java/org/exist/collections/triggers/XQueryTrigger.java +++ b/exist-core/src/main/java/org/exist/collections/triggers/XQueryTrigger.java @@ -54,11 +54,11 @@ import java.util.Properties; import java.util.Set; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.collections.Collection; import org.exist.dom.persistent.DocumentImpl; -import org.exist.dom.persistent.NodeSet; import org.exist.dom.QName; import org.exist.security.PermissionDeniedException; import org.exist.source.DBSource; @@ -246,8 +246,8 @@ private Source getQuerySource(final DBBroker broker) { private void prepare(final TriggerEvent event, final DBBroker broker, final Txn transaction, final XmldbURI src, final XmldbURI dst, final boolean isCollection) throws TriggerException { //get the query - final Source query = getQuerySource(broker); - if (query == null) { + final Source source = getQuerySource(broker); + if (source == null) { return; } @@ -259,53 +259,27 @@ private void prepare(final TriggerEvent event, final DBBroker broker, final Txn return; } - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - - compiled = broker.getBrokerPool().getXQueryPool().borrowCompiledXQuery(broker, query); - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } + final ConsumerE setupXqueryContextPreExecution = xqueryContext -> { + declareExternalVariables(xqueryContext, TriggerPhase.BEFORE, event, src, dst, isCollection); + }; - if (compiled == null) { - compiled = service.compile(context, query); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } - - declareExternalVariables(context, TriggerPhase.BEFORE, event, src, dst, isCollection); + try { + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreExecution, null, null); - //execute the XQuery - //TODO : should we provide another contextSet ? - final NodeSet contextSet = NodeSet.EMPTY_SET; - service.execute(broker, compiled, contextSet); - //TODO : should we have a special processing ? - if (LOG.isDebugEnabled()) { - LOG.debug("Trigger fired for prepare"); - } + if (LOG.isDebugEnabled()) { + LOG.debug("Trigger fired for prepare in: {}", queryResult.executionTime); + } - } catch (final XPathException | IOException | PermissionDeniedException e) { - TriggerStatePerThread.clear(); - throw new TriggerException(PREPARE_EXCEPTION_MESSAGE, e); - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - broker.getBrokerPool().getXQueryPool().returnCompiledXQuery(query, compiled); - } - } + } catch (final XPathException | IOException | PermissionDeniedException e) { + TriggerStatePerThread.clear(); + throw new TriggerException(PREPARE_EXCEPTION_MESSAGE, e); + } } private void finish(final TriggerEvent event, final DBBroker broker, final Txn transaction, final XmldbURI src, final XmldbURI dst, final boolean isCollection) { //get the query - final Source query = getQuerySource(broker); - if (query == null) { + final Source source = getQuerySource(broker); + if (source == null) { return; } @@ -317,47 +291,22 @@ private void finish(final TriggerEvent event, final DBBroker broker, final Txn t return; } - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - compiled = broker.getBrokerPool().getXQueryPool().borrowCompiledXQuery(broker, query); - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } + final ConsumerE setupXqueryContextPreExecution = xqueryContext -> { + declareExternalVariables(xqueryContext, TriggerPhase.AFTER, event, src, dst, isCollection); + }; - if (compiled == null) { - compiled = service.compile(context, query); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } - - declareExternalVariables(context, TriggerPhase.AFTER, event, src, dst, isCollection); - - //execute the XQuery - //TODO : should we provide another contextSet ? - final NodeSet contextSet = NodeSet.EMPTY_SET; - service.execute(broker, compiled, contextSet); - //TODO : should we have a special processing ? - - } catch (final XPathException | IOException | PermissionDeniedException e) { - LOG.error("Error during trigger finish", e); - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - broker.getBrokerPool().getXQueryPool().returnCompiledXQuery(query, compiled); - } - } + long executionTime = -1; + try { + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreExecution, null, null); + executionTime = queryResult.executionTime; + } catch (final XPathException | IOException | PermissionDeniedException e) { + LOG.error("Error during trigger finish", e); + } TriggerStatePerThread.clearIfFinished(TriggerPhase.AFTER); if (LOG.isDebugEnabled()) { - LOG.debug("Trigger fired for finish"); + LOG.debug("Trigger fired for finish in {}", executionTime); } } diff --git a/exist-core/src/main/java/org/exist/http/AuditTrailSessionListener.java b/exist-core/src/main/java/org/exist/http/AuditTrailSessionListener.java index a518377901..faa0237f30 100644 --- a/exist-core/src/main/java/org/exist/http/AuditTrailSessionListener.java +++ b/exist-core/src/main/java/org/exist/http/AuditTrailSessionListener.java @@ -45,6 +45,7 @@ */ package org.exist.http; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.dom.persistent.BinaryDocument; @@ -57,11 +58,10 @@ import org.exist.storage.XQueryPool; import org.exist.storage.lock.Lock.LockMode; import org.exist.xmldb.XmldbURI; -import org.exist.xquery.CompiledXQuery; -import org.exist.xquery.XQuery; +import org.exist.xquery.XPathException; import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.AnyURIValue; -import org.exist.xquery.value.Sequence; import jakarta.servlet.http.HttpSession; import jakarta.servlet.http.HttpSessionEvent; @@ -116,9 +116,7 @@ private void executeXQuery(String xqueryResourcePath) { if (xqueryResourcePath != null && xqueryResourcePath.length() > 0) { xqueryResourcePath = xqueryResourcePath.trim(); - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - @Nullable Source source = null; + @Nullable Source source; try { final BrokerPool pool = BrokerPool.getInstance(); @@ -146,45 +144,18 @@ private void executeXQuery(String xqueryResourcePath) { return; } - final XQuery xquery = pool.getXQueryService(); - if (xquery == null) { - LOG.error("broker unable to retrieve XQueryService"); - return; - } - - compiled = xqpool.borrowCompiledXQuery(broker, source); - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - context.setStaticallyKnownDocuments(new XmldbURI[]{pathUri}); - context.setBaseURI(new AnyURIValue(pathUri.toString())); - - if (compiled == null) { - compiled = xquery.compile(context, source); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.setStaticallyKnownDocuments(new XmldbURI[]{pathUri}); + xqueryContext.setBaseURI(new AnyURIValue(pathUri.toString())); + }; final Properties outputProperties = new Properties(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, outputProperties, setupXqueryContextPreCompilation, null, null); - final long startTime = System.currentTimeMillis(); - final Sequence result = xquery.execute(broker, compiled, null, outputProperties); - final long queryTime = System.currentTimeMillis() - startTime; if (LOG.isTraceEnabled()) { - LOG.trace("XQuery execution results: {} in {}ms.", result.toString(), queryTime); + LOG.trace("XQuery execution results: {} in {}ms.", queryResult.result.toString(), queryResult.executionTime); } } - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null && source != null) { - xqpool.returnCompiledXQuery(source, compiled); - } } } catch (final Exception e) { diff --git a/exist-core/src/main/java/org/exist/http/RESTServer.java b/exist-core/src/main/java/org/exist/http/RESTServer.java index 1ca05adde8..8df93de9f8 100644 --- a/exist-core/src/main/java/org/exist/http/RESTServer.java +++ b/exist-core/src/main/java/org/exist/http/RESTServer.java @@ -45,6 +45,8 @@ */ package org.exist.http; +import com.evolvedbinary.j8fu.function.BiConsumerE; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.apache.commons.io.output.StringBuilderWriter; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -73,7 +75,6 @@ import org.exist.source.URLSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; import org.exist.storage.lock.Lock.LockMode; import org.exist.storage.lock.ManagedCollectionLock; import org.exist.storage.serializers.EXistOutputKeys; @@ -94,6 +95,7 @@ import org.exist.xmldb.XmldbURI; import org.exist.xqj.Marshaller; import org.exist.xquery.*; +import org.exist.xquery.util.HTTPUtils; import org.exist.xquery.value.*; import org.exist.xupdate.Modification; import org.exist.xupdate.XUpdateProcessor; @@ -1370,10 +1372,10 @@ protected void search(final DBBroker broker, final Txn transaction, final String try { final int sessionId = Integer.parseInt(sessionIdParam); if (sessionId > -1) { - final Sequence cached = sessionManager.get(query, sessionId); - if (cached != null) { + @Nullable final XQueryUtil.QueryResult cachedQueryResult = sessionManager.get(query, sessionId); + if (cachedQueryResult != null) { LOG.debug("Returning cached query result"); - writeResults(response, broker, transaction, cached, howmany, start, typed, outputProperties, wrap, 0, 0); + writeResults(response, broker, transaction, cachedQueryResult, howmany, start, typed, outputProperties, wrap); } else { LOG.debug("Cached query result not found. Probably timed out. Repeating query."); @@ -1387,72 +1389,47 @@ protected void search(final DBBroker broker, final Txn transaction, final String final XmldbURI pathUri = XmldbURI.create(path); final Source source = new StringSource(query); - final XQueryPool pool = broker.getBrokerPool().getXQueryPool(); - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; try { - final XQuery xquery = broker.getBrokerPool().getXQueryService(); - compiled = pool.borrowCompiledXQuery(broker, source); - - // special header to indicate that the query is not returned from cache - response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, compiled == null ? "false" : "true"); - - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - context.setStaticallyKnownDocuments(new XmldbURI[]{pathUri}); - context.setBaseURI(new AnyURIValue(pathUri.toString())); - - declareNamespaces(context, namespaces); - - final long compilationTime; - if (compiled == null) { - final long compilationStart = System.currentTimeMillis(); - compiled = xquery.compile(context, source); - compilationTime = System.currentTimeMillis() - compilationStart; - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - compilationTime = 0; - } - - setupDefaultCollection(context, defaultCollectionParam); - declareVariables(context, variablesParam, request, response); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.setStaticallyKnownDocuments(new XmldbURI[]{ pathUri }); + xqueryContext.setBaseURI(new AnyURIValue(pathUri.toString())); + declareNamespaces(xqueryContext, namespaces); + }; + + final ConsumerE setupXqueryContextPreExecution = xqueryContext -> { + setupDefaultCollection(xqueryContext, defaultCollectionParam); + declareVariables(xqueryContext, variablesParam, request, response); + }; + + final BiConsumerE setupXqueryContextPostExecution = (xqueryContext, queryResult) -> { + // Pass last modified date to the HTTP response + HTTPUtils.addLastModifiedHeader(queryResult.result, xqueryContext); + }; @Nullable final Item contextItem = extractContextItem(contextItemParam); final Sequence contextSequence = contextItem != null ? new ValueSequence(contextItem) : null; - final long executeStart = System.currentTimeMillis(); - final Sequence resultSequence = xquery.execute(broker, compiled, contextSequence, outputProperties); - final long executionTime = System.currentTimeMillis() - executeStart; + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, contextSequence, outputProperties, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, setupXqueryContextPostExecution); + + // special header to indicate that the query is not returned from cache + response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); if (LOG.isDebugEnabled()) { - LOG.debug("Found {} in {}ms.", resultSequence.getItemCount(), executionTime); + LOG.debug("Found {} in {}ms.", queryResult.result.getItemCount(), queryResult.executionTime); } if (cache) { - final int sessionId = sessionManager.add(query, resultSequence); + final int sessionId = sessionManager.add(query, queryResult); outputProperties.setProperty(Serializer.PROPERTY_SESSION_ID, Integer.toString(sessionId)); if (!response.isCommitted()) { response.setIntHeader(SESSION_ID_HEADER, sessionId); } } - writeResults(response, broker, transaction, resultSequence, howmany, start, typed, outputProperties, wrap, compilationTime, executionTime); + writeResults(response, broker, transaction, queryResult, howmany, start, typed, outputProperties, wrap); } catch (final IOException e) { throw new BadRequestException(e.getMessage(), e); - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - pool.returnCompiledXQuery(source, compiled); - } } } @@ -1628,66 +1605,36 @@ private void executeXQuery(final DBBroker broker, final Txn transaction, final D throws XPathException, BadRequestException, PermissionDeniedException { final Source source = new DBSource(broker.getBrokerPool(), (BinaryDocument) resource, true); - final XQueryPool pool = broker.getBrokerPool().getXQueryPool(); - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - final XQuery xquery = broker.getBrokerPool().getXQueryService(); - compiled = pool.borrowCompiledXQuery(broker, source); - - // special header to indicate that the query is not returned from cache - response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, compiled == null ? "false" : "true"); - - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - // TODO: don't hardcode this? - context.setModuleLoadPath( - XmldbURI.EMBEDDED_SERVER_URI.append( - resource.getCollection().getURI()).toString()); - context.setStaticallyKnownDocuments( - new XmldbURI[]{resource.getCollection().getURI()}); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.setModuleLoadPath(XmldbURI.EMBEDDED_SERVER_URI.append(resource.getCollection().getURI()).toString()); + xqueryContext.setStaticallyKnownDocuments(new XmldbURI[]{ resource.getCollection().getURI() }); + }; - final long compilationTime; - if (compiled == null) { - try { - final long compilationStart = System.currentTimeMillis(); - compiled = xquery.compile(context, source); - compilationTime = System.currentTimeMillis() - compilationStart; - } catch (final IOException e) { - throw new BadRequestException("Failed to read query from " + resource.getURI(), e); - } - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - compilationTime = 0; - } - - final HttpRequestWrapper reqw = declareVariables(context, null, request, response); + final ConsumerE setupXqueryContextPreExecution = xqueryContext -> { + final HttpRequestWrapper reqw = declareVariables(xqueryContext, null, request, response); reqw.setServletPath(servletPath); reqw.setPathInfo(pathInfo); + DebuggeeFactory.checkForDebugRequest(request, xqueryContext); + }; - DebuggeeFactory.checkForDebugRequest(request, context); + final BiConsumerE setupXqueryContextPostExecution = (xqueryContext, queryResult) -> { + // Pass last modified date to the HTTP response + HTTPUtils.addLastModifiedHeader(queryResult.result, xqueryContext); + }; - final boolean wrap = "yes".equals(outputProperties.getProperty("_wrap")); + final XQueryUtil.QueryResult queryResult; + try { + queryResult = XQueryUtil.query(broker, source, true, null, outputProperties, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, setupXqueryContextPostExecution); + } catch (final IOException e) { + throw new BadRequestException("Failed to read query from " + resource.getURI(), e); + } - final long executeStart = System.currentTimeMillis(); - final Sequence result = xquery.execute(broker, compiled, null, outputProperties); - writeResults(response, broker, transaction, result, -1, 1, false, outputProperties, wrap, compilationTime, System.currentTimeMillis() - executeStart); + // Special header to indicate whether the compiled query is returned from the cache + response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - pool.returnCompiledXQuery(source, compiled); - } - } + final boolean wrap = "yes".equals(outputProperties.getProperty("_wrap")); + writeResults(response, broker, transaction, queryResult, -1, 1, false, outputProperties, wrap); } /** @@ -1701,84 +1648,53 @@ private void executeXProc(final DBBroker broker, final Txn transaction, final Do throws XPathException, BadRequestException, PermissionDeniedException { final URLSource source = new URLSource(this.getClass().getResource("run-xproc.xq")); - final XQueryPool pool = broker.getBrokerPool().getXQueryPool(); - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - - try { - final XQuery xquery = broker.getBrokerPool().getXQueryService(); - compiled = pool.borrowCompiledXQuery(broker, source); - // special header to indicate that the query is not returned from cache - response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, compiled == null ? "false" : "true"); - - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - // TODO: don't hardcode this? - context.setModuleLoadPath( - XmldbURI.EMBEDDED_SERVER_URI.append( - resource.getCollection().getURI()).toString()); - - context.setStaticallyKnownDocuments( - new XmldbURI[]{resource.getCollection().getURI()}); - - // compile query - final long compilationTime; - if (compiled == null) { - try { - final long compilationStart = System.currentTimeMillis(); - compiled = xquery.compile(context, source); - compilationTime = System.currentTimeMillis() - compilationStart; - } catch (final IOException e) { - throw new BadRequestException("Failed to read query from " - + source.getURL(), e); - } - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - compilationTime = 0; - } + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.setModuleLoadPath(XmldbURI.EMBEDDED_SERVER_URI.append(resource.getCollection().getURI()).toString()); + xqueryContext.setStaticallyKnownDocuments(new XmldbURI[]{resource.getCollection().getURI()}); + }; + final ConsumerE setupXqueryContextPreExecution = xqueryContext -> { // declare variables - context.declareVariable("pipeline", true, resource.getURI().toString()); + xqueryContext.declareVariable("pipeline", true, resource.getURI().toString()); final String stdin = request.getParameter("stdin"); - context.declareVariable("stdin", true, stdin == null ? "" : stdin); + xqueryContext.declareVariable("stdin", true, stdin == null ? "" : stdin); final String debug = request.getParameter("debug"); - context.declareVariable("debug", true, debug == null ? "0" : "1"); + xqueryContext.declareVariable("debug", true, debug == null ? "0" : "1"); final String bindings = request.getParameter("bindings"); - context.declareVariable("bindings", true, bindings == null ? "" : bindings); + xqueryContext.declareVariable("bindings", true, bindings == null ? "" : bindings); final String autobind = request.getParameter("autobind"); - context.declareVariable("autobind", true, autobind == null ? "0" : "1"); + xqueryContext.declareVariable("autobind", true, autobind == null ? "0" : "1"); final String options = request.getParameter("options"); - context.declareVariable("options", true, options == null ? "" : options); + xqueryContext.declareVariable("options", true, options == null ? "" : options); - final HttpRequestWrapper reqw = declareVariables(context, null, request, response); + final HttpRequestWrapper reqw = declareVariables(xqueryContext, null, request, response); reqw.setServletPath(servletPath); reqw.setPathInfo(pathInfo); + }; - // execute query - final long executeStart = System.currentTimeMillis(); - final Sequence result = xquery.execute(broker, compiled, null, outputProperties); - writeResults(response, broker, transaction, result, -1, 1, false, outputProperties, false, compilationTime, System.currentTimeMillis() - executeStart); + final BiConsumerE setupXqueryContextPostExecution = (xqueryContext, queryResult) -> { + // Pass last modified date to the HTTP response + HTTPUtils.addLastModifiedHeader(queryResult.result, xqueryContext); + }; - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - pool.returnCompiledXQuery(source, compiled); - } + // execute query + final XQueryUtil.QueryResult queryResult; + try { + queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, setupXqueryContextPostExecution); + } catch (final IOException e) { + throw new BadRequestException("Failed to read query from " + source.getURL(), e); } + + // special header to indicate that the query is not returned from cache + response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); + + writeResults(response, broker, transaction, queryResult, -1, 1, false, outputProperties, false); } public void setCreatedAndLastModifiedHeaders( @@ -2241,9 +2157,8 @@ protected void addPermissionAttributes(final AttributesImpl attrs, final Permiss } protected void writeResults(final HttpServletResponse response, final DBBroker broker, final Txn transaction, - final Sequence results, int howmany, final int start, final boolean typed, - final Properties outputProperties, final boolean wrap, final long compilationTime, final long executionTime) - throws BadRequestException { + final XQueryUtil.QueryResult queryResult, int howmany, final int start, final boolean typed, + final Properties outputProperties, final boolean wrap) throws BadRequestException { // some xquery functions can write directly to the output stream // (response:stream-binary() etc...) @@ -2253,8 +2168,8 @@ protected void writeResults(final HttpServletResponse response, final DBBroker b } // calculate number of results to return - if (!results.isEmpty()) { - final int rlen = results.getItemCount(); + if (!queryResult.result.isEmpty()) { + final int rlen = queryResult.result.getItemCount(); if ((start < 1) || (start > rlen)) { throw new BadRequestException("Start parameter out of range"); } @@ -2268,9 +2183,9 @@ protected void writeResults(final HttpServletResponse response, final DBBroker b final String method = outputProperties.getProperty(SERIALIZATION_METHOD_PROPERTY, "xml"); if ("json".equals(method)) { - writeResultJSON(response, broker, transaction, results, howmany, start, outputProperties, wrap, compilationTime, executionTime); + writeResultJSON(response, broker, transaction, queryResult, howmany, start, outputProperties, wrap); } else { - writeResultXML(response, broker, results, howmany, start, typed, outputProperties, wrap, compilationTime, executionTime); + writeResultXML(response, broker, queryResult, howmany, start, typed, outputProperties, wrap); } } @@ -2280,9 +2195,9 @@ private static String getEncoding(final Properties outputProperties) { } private void writeResultXML(final HttpServletResponse response, - final DBBroker broker, final Sequence results, final int howmany, - final int start, final boolean typed, final Properties outputProperties, - final boolean wrap, final long compilationTime, final long executionTime) throws BadRequestException { + final DBBroker broker, final XQueryUtil.QueryResult queryResult, final int howmany, + final int start, final boolean typed, final Properties outputProperties, + final boolean wrap) throws BadRequestException { // serialize the results to the response output stream outputProperties.setProperty(Serializer.GENERATE_DOC_EVENTS, "false"); @@ -2314,7 +2229,7 @@ private void writeResultXML(final HttpServletResponse response, final XQuerySerializer serializer = new XQuerySerializer(broker, outputProperties, writer); //Marshaller.marshall(broker, results, start, howmany, serializer.getContentHandler()); - serializer.serialize(results, start, howmany, wrap, typed, compilationTime, executionTime); + serializer.serialize(queryResult, start, howmany, wrap, typed); writer.flush(); writerToClose = writer; @@ -2336,19 +2251,19 @@ private void writeResultXML(final HttpServletResponse response, } private void writeResultJSON(final HttpServletResponse response, - final DBBroker broker, final Txn transaction, final Sequence results, int howmany, - int start, final Properties outputProperties, final boolean wrap, final long compilationTime, final long executionTime) + final DBBroker broker, final Txn transaction, final XQueryUtil.QueryResult queryResult, int howmany, + int start, final Properties outputProperties, final boolean wrap) throws BadRequestException { // calculate number of results to return - final int rlen = results.getItemCount(); - if (!results.isEmpty()) { - if ((start < 1) || (start > rlen)) { + final int resultCount = queryResult.result.getItemCount(); + if (resultCount > 0) { + if ((start < 1) || (start > resultCount)) { throw new BadRequestException("Start parameter out of range"); } // FD : correct bound evaluation - if (((howmany + start) > rlen) || (howmany <= 0)) { - howmany = rlen - start + 1; + if (((howmany + start) > resultCount) || (howmany <= 0)) { + howmany = resultCount - start + 1; } } else { howmany = 0; @@ -2364,20 +2279,20 @@ private void writeResultJSON(final HttpServletResponse response, final JSONObject root = new JSONObject(); root.addObject(new JSONSimpleProperty("start", Integer.toString(start), true)); root.addObject(new JSONSimpleProperty("count", Integer.toString(howmany), true)); - root.addObject(new JSONSimpleProperty("hits", Integer.toString(results.getItemCount()), true)); + root.addObject(new JSONSimpleProperty("hits", Integer.toString(resultCount), true)); if (outputProperties.getProperty(Serializer.PROPERTY_SESSION_ID) != null) { root.addObject(new JSONSimpleProperty("session", outputProperties.getProperty(Serializer.PROPERTY_SESSION_ID))); } - root.addObject(new JSONSimpleProperty("compilationTime", Long.toString(compilationTime), true)); - root.addObject(new JSONSimpleProperty("executionTime", Long.toString(executionTime), true)); + root.addObject(new JSONSimpleProperty("compilationTime", Long.toString(queryResult.compilationTime), true)); + root.addObject(new JSONSimpleProperty("executionTime", Long.toString(queryResult.executionTime), true)); final JSONObject data = new JSONObject("data"); root.addObject(data); try (final StringBuilderWriter sbWriter = new StringBuilderWriter()) { for (int i = --start; i < start + howmany; i++) { - final Item item = results.itemAt(i); + final Item item = queryResult.result.itemAt(i); if (Type.subTypeOf(item.getType(), Type.NODE)) { final NodeValue value = (NodeValue) item; sbWriter.getBuilder().setLength(0); diff --git a/exist-core/src/main/java/org/exist/http/SessionManager.java b/exist-core/src/main/java/org/exist/http/SessionManager.java index 19282d702a..9372250c4e 100644 --- a/exist-core/src/main/java/org/exist/http/SessionManager.java +++ b/exist-core/src/main/java/org/exist/http/SessionManager.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -26,7 +50,7 @@ import net.jcip.annotations.ThreadSafe; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.exist.xquery.value.Sequence; +import org.exist.xquery.XQueryUtil; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -41,15 +65,15 @@ public class SessionManager { private static final long TIMEOUT = 120_000; // ms (e.g. 2 minutes) private final AtomicInteger sessionIdCounter = new AtomicInteger(); - private final Cache cache; + private final Cache cache; - private static class QueryResult { + private static class QueryAndResult { final String query; - final Sequence sequence; + final XQueryUtil.QueryResult result; - private QueryResult(final String query, final Sequence sequence) { + private QueryAndResult(final String query, final XQueryUtil.QueryResult result) { this.query = query; - this.sequence = sequence; + this.result = result; } } @@ -62,24 +86,24 @@ public SessionManager() { cache = cacheBuilder.build(); } - public int add(final String query, final Sequence sequence) { + public int add(final String query, final XQueryUtil.QueryResult result) { final int sessionId = sessionIdCounter.getAndIncrement(); - cache.put(sessionId, new QueryResult(query, sequence)); + cache.put(sessionId, new QueryAndResult(query, result)); return sessionId; } - public Sequence get(final String query, final int sessionId) { + public XQueryUtil.QueryResult get(final String query, final int sessionId) { if (sessionId < 0 || sessionId >= sessionIdCounter.get()) { return null; // out of scope } - final QueryResult cached = cache.getIfPresent(sessionId); + final QueryAndResult cached = cache.getIfPresent(sessionId); if (cached == null) { return null; } if (cached.query.equals(query)) { - return cached.sequence; + return cached.result; } else { // wrong query return null; diff --git a/exist-core/src/main/java/org/exist/http/servlets/RedirectorServlet.java b/exist-core/src/main/java/org/exist/http/servlets/RedirectorServlet.java index 89825641f2..f1c8888057 100644 --- a/exist-core/src/main/java/org/exist/http/servlets/RedirectorServlet.java +++ b/exist-core/src/main/java/org/exist/http/servlets/RedirectorServlet.java @@ -45,6 +45,7 @@ */ package org.exist.http.servlets; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.EXistException; @@ -53,12 +54,10 @@ import org.exist.source.FileSource; import org.exist.source.Source; import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; import org.exist.xmldb.XmldbURI; -import org.exist.xquery.CompiledXQuery; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -70,7 +69,6 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import javax.annotation.Nullable; import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Files; @@ -293,43 +291,20 @@ protected void service(final HttpServletRequest req, final HttpServletResponse r } private Sequence executeQuery(final Source source, final RequestWrapper request, final ResponseWrapper response) throws EXistException, XPathException, PermissionDeniedException, IOException { - final XQuery xquery = getPool().getXQueryService(); - final XQueryPool pool = getPool().getXQueryPool(); - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; try (final DBBroker broker = getPool().getBroker()) { - compiled = pool.borrowCompiledXQuery(broker, source); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.setModuleLoadPath(XmldbURI.EMBEDDED_SERVER_URI.toString()); + }; - // special header to indicate that the query is not returned from cache - response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, compiled == null ? "false" : "true"); - - if (compiled == null) { - context = new XQueryContext(getPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - context.setModuleLoadPath(XmldbURI.EMBEDDED_SERVER_URI.toString()); + final Properties outputProperties = new Properties(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, outputProperties, setupXqueryContextPreCompilation, null, null); - if (compiled == null) { - compiled = xquery.compile(context, source); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } - - return xquery.execute(broker, compiled, null, new Properties()); + // special header to indicate that the query is not returned from cache + response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - pool.returnCompiledXQuery(source, compiled); - } + return queryResult.result; } } diff --git a/exist-core/src/main/java/org/exist/http/servlets/XQueryServlet.java b/exist-core/src/main/java/org/exist/http/servlets/XQueryServlet.java index d7f921179e..33d4706563 100644 --- a/exist-core/src/main/java/org/exist/http/servlets/XQueryServlet.java +++ b/exist-core/src/main/java/org/exist/http/servlets/XQueryServlet.java @@ -45,6 +45,8 @@ */ package org.exist.http.servlets; +import com.evolvedbinary.j8fu.function.BiConsumerE; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.EXistException; @@ -62,6 +64,7 @@ import org.exist.util.serializer.XQuerySerializer; import org.exist.xmldb.XmldbURI; import org.exist.xquery.*; +import org.exist.xquery.util.HTTPUtils; import org.exist.xquery.value.Item; import org.exist.xquery.value.Sequence; import xyz.elemental.mediatype.MediaType; @@ -456,69 +459,60 @@ protected void process(HttpServletRequest request, HttpServletResponse response) // baseUri = null; // } - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - final String requestAttr = (String) request.getAttribute(ATTR_XQUERY_ATTRIBUTE); - try(final DBBroker broker = getPool().get(Optional.ofNullable(user))) { - final XQuery xquery = broker.getBrokerPool().getXQueryService(); - compiled = getPool().getXQueryPool().borrowCompiledXQuery(broker, source); + try (final DBBroker broker = getPool().get(Optional.ofNullable(user))) { - // special header to indicate that the query is not returned from cache - response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, compiled == null ? "false" : "true"); - - if (compiled == null) { - context = new XQueryContext(getPool()); - context.setModuleLoadPath(moduleLoadPath); - } else { - context = compiled.getContext(); - context.setModuleLoadPath(moduleLoadPath); - context.prepareForReuse(); - } - - - if (compiled == null) { - try { - compiled = xquery.compile(context, source); - } catch (final XPathException e) { - throw new EXistException("Cannot compile xquery: " + e.getMessage(), e); - } catch (final IOException e) { - throw new EXistException("I/O exception while compiling xquery: " + e.getMessage(), e); - } - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } - - final Properties outputProperties = new Properties(); - outputProperties.put("base-uri", collectionURI.toString()); - - final HttpRequestWrapper reqw = new HttpRequestWrapper(request, getFormEncoding(), getContainerEncoding()); - final ResponseWrapper respw = new HttpResponseWrapper(response); - context.setHttpContext(new XQueryContext.HttpContext(reqw, respw, session != null ? new HttpSessionWrapper( session ) : null)); + final String requestXqueryAttr = (String) request.getAttribute(ATTR_XQUERY_ATTRIBUTE); + @Nullable final Long timeout; final String timeoutOpt = (String) request.getAttribute(ATTR_TIMEOUT); if (timeoutOpt != null) { try { - final long timeout = Long.parseLong(timeoutOpt); - context.getWatchDog().setTimeout(timeout); + timeout = Long.parseLong(timeoutOpt); } catch (final NumberFormatException e) { throw new EXistException("Bad timeout option: " + timeoutOpt); } + } else { + timeout = null; } + @Nullable final Integer maxNodes; final String maxNodesOpt = (String) request.getAttribute(ATTR_MAX_NODES); if (maxNodesOpt != null) { try{ - final int maxNodes = Integer.parseInt(maxNodesOpt); - context.getWatchDog().setMaxNodes(maxNodes); + maxNodes = Integer.parseInt(maxNodesOpt); } catch (final NumberFormatException e) { throw new EXistException("Bad max-nodes option: " + maxNodesOpt); } + } else { + maxNodes = null; } - DebuggeeFactory.checkForDebugRequest(request, context); + final HttpRequestWrapper reqw = new HttpRequestWrapper(request, getFormEncoding(), getContainerEncoding()); + final ResponseWrapper respw = new HttpResponseWrapper(response); - final Sequence resultSequence = xquery.execute(broker, compiled, null, outputProperties); + final ConsumerE setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.setHttpContext(new XQueryContext.HttpContext(reqw, respw, session != null ? new HttpSessionWrapper(session) : null)); + if (timeout != null) { + xqueryContext.getWatchDog().setTimeout(timeout); + } + if (maxNodes != null) { + xqueryContext.getWatchDog().setMaxNodes(maxNodes); + } + DebuggeeFactory.checkForDebugRequest(request, xqueryContext); + }; + + final BiConsumerE setupXqueryContextPostExecution = (xqueryContext, queryResult) -> { + // Pass last modified date to the HTTP response + HTTPUtils.addLastModifiedHeader(queryResult.result, xqueryContext); + }; + + final Properties outputProperties = new Properties(); + outputProperties.put("base-uri", collectionURI.toString()); + + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, outputProperties, null, setupXqueryContextPreExecution, setupXqueryContextPostExecution); + + // special header to indicate that the query is not returned from cache + response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); final String mediaType = outputProperties.getProperty(OutputKeys.MEDIA_TYPE); if (mediaType != null) { @@ -535,8 +529,9 @@ protected void process(HttpServletRequest request, HttpServletResponse response) String contentType = this.contentType; try { contentType = getServletContext().getMimeType(path); - if (contentType == null) - {contentType = this.contentType;} + if (contentType == null) { + contentType = this.contentType; + } } catch (final Throwable e) { contentType = this.contentType; @@ -545,16 +540,16 @@ protected void process(HttpServletRequest request, HttpServletResponse response) if (isTextContent(contentType)) { contentType += "; charset=" + getFormEncoding(); } - response.setContentType(contentType ); + response.setContentType(contentType); } } - if (requestAttr != null && (XmldbURI.API_LOCAL.equals(collectionURI.getApiName())) ) { - request.setAttribute(requestAttr, resultSequence); + if (requestXqueryAttr != null && (XmldbURI.API_LOCAL.equals(collectionURI.getApiName())) ) { + request.setAttribute(requestXqueryAttr, queryResult.result); } else { - XQuerySerializer serializer = new XQuerySerializer(broker, outputProperties, output); - serializer.serialize(resultSequence); + final XQuerySerializer serializer = new XQuerySerializer(broker, outputProperties, output); + serializer.serialize(queryResult.result); } } catch (final PermissionDeniedException e) { @@ -565,7 +560,7 @@ protected void process(HttpServletRequest request, HttpServletResponse response) } return; - } catch (final XPathException e){ + } catch (final XPathException e) { final Logger logger = getLog(); if(logger.isDebugEnabled()) { @@ -587,14 +582,6 @@ protected void process(HttpServletRequest request, HttpServletResponse response) response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); sendError(output, "Error", e.getMessage()); } - - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - getPool().getXQueryPool().returnCompiledXQuery(source, compiled); - } } output.flush(); diff --git a/exist-core/src/main/java/org/exist/http/urlrewrite/XQueryURLRewrite.java b/exist-core/src/main/java/org/exist/http/urlrewrite/XQueryURLRewrite.java index e139e1944e..9027ba16b8 100644 --- a/exist-core/src/main/java/org/exist/http/urlrewrite/XQueryURLRewrite.java +++ b/exist-core/src/main/java/org/exist/http/urlrewrite/XQueryURLRewrite.java @@ -45,6 +45,7 @@ */ package org.exist.http.urlrewrite; +import com.evolvedbinary.j8fu.function.ConsumerE; import jakarta.servlet.annotation.MultipartConfig; import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream; import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream; @@ -72,7 +73,6 @@ import org.exist.source.SourceFactory; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; import org.exist.storage.lock.Lock.LockMode; import org.exist.storage.serializers.Serializer; import org.exist.util.LockException; @@ -669,53 +669,24 @@ private Sequence runQuery(final DBBroker broker, final RequestWrapper request, f if (sourceInfo == null) { return Sequence.EMPTY_SEQUENCE; // no controller found } + model.setSourceInfo(sourceInfo); final String basePath = staticRewrite == null ? "." : staticRewrite.getTarget(); - final XQuery xquery = broker.getBrokerPool().getXQueryService(); - final XQueryPool xqyPool = broker.getBrokerPool().getXQueryPool(); - - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - if (compiledCache) { - compiled = xqyPool.borrowCompiledXQuery(broker, sourceInfo.source); - } - - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { // Find correct module load path - context.setModuleLoadPath(sourceInfo.moduleLoadPath); + xqueryContext.setModuleLoadPath(sourceInfo.moduleLoadPath); + }; - if (compiled == null) { - try { - compiled = xquery.compile(context, sourceInfo.source); - } catch (final IOException e) { - throw new ServletException("Failed to read query from " + query, e); - } - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } - - declareVariables(context, sourceInfo, staticRewrite, basePath, request, response); - - model.setSourceInfo(sourceInfo); - - return xquery.execute(broker, compiled, null, outputProperties); + final ConsumerE setupXqueryContextPreExecution = xqueryContext -> { + declareVariables(xqueryContext, sourceInfo, staticRewrite, basePath, request, response); + }; - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null && compiledCache) { - xqyPool.returnCompiledXQuery(sourceInfo.source, compiled); - } + try { + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, sourceInfo.source, compiledCache, null, outputProperties, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); + return queryResult.result; + } catch (final IOException e) { + throw new XPathException("Unable to compile query source: " + e.getMessage(), e); } } diff --git a/exist-core/src/main/java/org/exist/launcher/Launcher.java b/exist-core/src/main/java/org/exist/launcher/Launcher.java index 043c9d27ca..d486d19429 100644 --- a/exist-core/src/main/java/org/exist/launcher/Launcher.java +++ b/exist-core/src/main/java/org/exist/launcher/Launcher.java @@ -49,6 +49,7 @@ import org.exist.jetty.JettyStart; import org.exist.repo.ExistRepository; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.start.CompatibleJavaVersionCheck; import org.exist.start.Main; import org.exist.start.StartException; @@ -58,7 +59,7 @@ import org.exist.util.FileUtils; import org.exist.util.SystemExitCodes; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceIterator; @@ -705,8 +706,8 @@ private void checkInstalledApps() { final BrokerPool pool = BrokerPool.getInstance(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = pool.getXQueryService(); - final Sequence pkgs = xquery.execute(broker, "repo:list()", null); + final String query = "repo:list()"; + final Sequence pkgs = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; for (final SequenceIterator i = pkgs.iterate(); i.hasNext(); ) { final ExistRepository.Notification notification = new ExistRepository.Notification(ExistRepository.Action.INSTALL, i.nextItem().getStringValue()); final Optional expathRepo = pool.getExpathRepo(); @@ -717,7 +718,7 @@ private void checkInstalledApps() { expathRepo.orElseThrow(() -> new EXistException("EXPath repository is not available.")); } } - } catch (final EXistException | XPathException | PermissionDeniedException e) { + } catch (final EXistException | IOException | XPathException | PermissionDeniedException e) { System.err.println("Failed to check installed packages: " + e.getMessage()); e.printStackTrace(); } diff --git a/exist-core/src/main/java/org/exist/management/impl/SanityReport.java b/exist-core/src/main/java/org/exist/management/impl/SanityReport.java index 72b6b12491..78a204b2c2 100644 --- a/exist-core/src/main/java/org/exist/management/impl/SanityReport.java +++ b/exist-core/src/main/java/org/exist/management/impl/SanityReport.java @@ -47,7 +47,6 @@ import java.util.*; -import javax.annotation.Nullable; import javax.management.*; import org.apache.logging.log4j.LogManager; @@ -60,10 +59,7 @@ import org.exist.storage.ConsistencyCheckTask; import org.exist.storage.DBBroker; import org.exist.storage.SystemTask; -import org.exist.storage.XQueryPool; -import org.exist.xquery.CompiledXQuery; -import org.exist.xquery.XQuery; -import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; public class SanityReport extends NotificationBroadcasterSupport implements SanityReportMXBean { @@ -208,35 +204,7 @@ public long ping(boolean checkQueryEngine) { try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getGuestSubject()))) { if (checkQueryEngine) { - final XQuery xquery = pool.getXQueryService(); - final XQueryPool xqPool = pool.getXQueryPool(); - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - compiled = xqPool.borrowCompiledXQuery(broker, TEST_XQUERY); - if (compiled == null) { - context = new XQueryContext(pool); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - if (compiled == null) { - compiled = xquery.compile(context, TEST_XQUERY); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } - - xquery.execute(broker, compiled, null); - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - xqPool.returnCompiledXQuery(TEST_XQUERY, compiled); - } - } + XQueryUtil.query(broker, TEST_XQUERY, true, null, null, null, null, null); } } catch (final Exception e) { lastPingRespTime = -2; diff --git a/exist-core/src/main/java/org/exist/repo/Deployment.java b/exist-core/src/main/java/org/exist/repo/Deployment.java index 45e86f4da1..a3ce3d51e6 100644 --- a/exist-core/src/main/java/org/exist/repo/Deployment.java +++ b/exist-core/src/main/java/org/exist/repo/Deployment.java @@ -46,6 +46,7 @@ package org.exist.repo; import com.evolvedbinary.j8fu.Either; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.EXistException; @@ -715,67 +716,46 @@ public String getPurposeString() { private Sequence runQuery(final DBBroker broker, final XmldbURI targetCollection, final Path tempDir, final String fileName, final String pkgName, final QueryPurpose purpose) throws PackageException, IOException, XPathException { - final Path xquery = tempDir.resolve(fileName); - if (!Files.isReadable(xquery)) { + final Path xqueryPath = tempDir.resolve(fileName); + if (!Files.isReadable(xqueryPath)) { LOG.warn("The XQuery resource specified in the {} was not found for EXPath Package: '{}'", purpose.getPurposeString(), pkgName); return Sequence.EMPTY_SEQUENCE; } - final Source source = new FileSource(xquery, false); - - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - compiled = broker.getBrokerPool().getXQueryPool().borrowCompiledXQuery(broker, source); - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } + final Source source = new FileSource(xqueryPath, false); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { if (targetCollection != null) { - context.setModuleLoadPath(XmldbURI.EMBEDDED_SERVER_URI + targetCollection.toString()); + xqueryContext.setModuleLoadPath(XmldbURI.EMBEDDED_SERVER_URI + targetCollection.toString()); } + if (QueryPurpose.PREINSTALL == purpose) { // when running pre-setup scripts, base path should point to directory // because the target collection does not yet exist - context.setModuleLoadPath(tempDir.toAbsolutePath().toString()); + xqueryContext.setModuleLoadPath(tempDir.toAbsolutePath().toString()); } + }; - // Compile query - final XQuery xqueryService = broker.getBrokerPool().getXQueryService(); - if (compiled == null) { - compiled = xqueryService.compile(context, source); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } + final ConsumerE setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("dir", true, tempDir.toAbsolutePath().toString()); - // Set variables - context.declareVariable("dir", true, tempDir.toAbsolutePath().toString()); final Optional home = broker.getConfiguration().getExistHome(); if (home.isPresent()) { - context.declareVariable("home", true, home.get().toAbsolutePath().toString()); + xqueryContext.declareVariable("home", true, home.get().toAbsolutePath().toString()); } + if (targetCollection != null) { - context.declareVariable("target", true, targetCollection.toString()); + xqueryContext.declareVariable("target", true, targetCollection.toString()); } else { - context.declareVariable("target", true, Sequence.EMPTY_SEQUENCE); + xqueryContext.declareVariable("target", true, Sequence.EMPTY_SEQUENCE); } + }; - // Execute query - return xqueryService.execute(broker, compiled, null); - + try { + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); + return queryResult.result; } catch (final PermissionDeniedException e) { throw new PackageException(e.getMessage(), e); - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - broker.getBrokerPool().getXQueryPool().returnCompiledXQuery(source, compiled); - } } } diff --git a/exist-core/src/main/java/org/exist/scheduler/UserXQueryJob.java b/exist-core/src/main/java/org/exist/scheduler/UserXQueryJob.java index c70af532e4..79ba3f30a8 100644 --- a/exist-core/src/main/java/org/exist/scheduler/UserXQueryJob.java +++ b/exist-core/src/main/java/org/exist/scheduler/UserXQueryJob.java @@ -49,6 +49,8 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.Properties; + +import com.evolvedbinary.j8fu.function.ConsumerE; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.EXistException; @@ -61,13 +63,11 @@ import org.exist.source.SourceFactory; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; import org.exist.storage.lock.Lock.LockMode; import org.exist.xmldb.XmldbURI; -import org.exist.xquery.CompiledXQuery; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.StringValue; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; @@ -206,70 +206,39 @@ public final void execute(final JobExecutionContext jec) throws JobExecutionExce } private void executeXQuery(final BrokerPool pool, final DBBroker broker, final Source source, final Properties params) throws PermissionDeniedException, XPathException, JobExecutionException { - final XQueryPool xqPool = pool.getXQueryPool(); - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - //execute the xquery - final XQuery xquery = pool.getXQueryService(); - - //try and get a pre-compiled query from the pool - compiled = xqPool.borrowCompiledXQuery(broker, source); - - if (compiled == null) { - context = new XQueryContext(pool); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - if(source instanceof DBSource) { - final XmldbURI collectionUri = ((DBSource)source).getDocumentPath().removeLastSegment(); - context.setModuleLoadPath(XmldbURI.EMBEDDED_SERVER_URI.append(collectionUri.getCollectionPath()).toString()); - context.setStaticallyKnownDocuments(new XmldbURI[] { collectionUri }); - } - if (compiled == null) { - try { - compiled = xquery.compile(context, source); - } catch (final IOException e) { - abort("Failed to read query from " + xqueryResource); - } - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + if (source instanceof DBSource) { + final XmldbURI collectionUri = ((DBSource) source).getDocumentPath().removeLastSegment(); + xqueryContext.setModuleLoadPath(XmldbURI.EMBEDDED_SERVER_URI.append(collectionUri.getCollectionPath()).toString()); + xqueryContext.setStaticallyKnownDocuments(new XmldbURI[]{collectionUri}); } + }; + final ConsumerE setupXqueryContextPreExecution = xqueryContext -> { //declare any parameters as external variables if (params != null) { - String bindingPrefix = params.getProperty("bindingPrefix"); + @Nullable String bindingPrefix = params.getProperty("bindingPrefix"); if (bindingPrefix == null) { bindingPrefix = "local"; } - for (final Entry param : params.entrySet()) { final String key = (String) param.getKey(); final String value = (String) param.getValue(); - context.declareVariable(bindingPrefix + ":" + key, true, new StringValue(value)); + xqueryContext.declareVariable(bindingPrefix + ":" + key, true, new StringValue(value)); } } + }; - xquery.execute(broker, compiled, null); - } finally { - if(context != null) { - context.runCleanupTasks(); - } - - //return the compiled query to the pool - if(xqPool != null && source != null && compiled != null) { - xqPool.returnCompiledXQuery(source, compiled); - } + try { + XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); + } catch (final IOException e) { + abort("Failed to read query from " + xqueryResource); } } - private void abort(final String message) throws JobExecutionException { abort(message, true); } diff --git a/exist-core/src/main/java/org/exist/source/AbstractSource.java b/exist-core/src/main/java/org/exist/source/AbstractSource.java index 24bbdf9ebb..ae627275a7 100644 --- a/exist-core/src/main/java/org/exist/source/AbstractSource.java +++ b/exist-core/src/main/java/org/exist/source/AbstractSource.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -28,6 +52,7 @@ import net.jpountz.xxhash.XXHash64; import net.jpountz.xxhash.XXHashFactory; +import org.exist.EXistException; import org.exist.dom.QName; import org.exist.security.PermissionDeniedException; import org.exist.security.Subject; @@ -63,7 +88,7 @@ public Charset getEncoding() throws IOException { } @Deprecated - public void validate(final Subject subject, final int perm) throws PermissionDeniedException { + public void validate(final Subject subject, final int perm) throws PermissionDeniedException, EXistException { // no-op } diff --git a/exist-core/src/main/java/org/exist/source/Source.java b/exist-core/src/main/java/org/exist/source/Source.java index 5887743017..a022af911a 100644 --- a/exist-core/src/main/java/org/exist/source/Source.java +++ b/exist-core/src/main/java/org/exist/source/Source.java @@ -50,6 +50,7 @@ import java.io.InputStream; import java.nio.charset.Charset; +import org.exist.EXistException; import org.exist.dom.QName; import org.exist.security.PermissionDeniedException; import org.exist.security.Subject; @@ -144,7 +145,7 @@ enum Validity { * @deprecated These security checks only apply to {@link DBSource} and should be done by the caller */ @Deprecated - void validate(Subject subject, int perm) throws PermissionDeniedException; + void validate(Subject subject, int perm) throws PermissionDeniedException, EXistException; /** * Check if the source is an XQuery module. If it is, return a QName containing diff --git a/exist-core/src/main/java/org/exist/storage/serializers/XIncludeFilter.java b/exist-core/src/main/java/org/exist/storage/serializers/XIncludeFilter.java index 5c7c40cc0a..c42e39c802 100644 --- a/exist-core/src/main/java/org/exist/storage/serializers/XIncludeFilter.java +++ b/exist-core/src/main/java/org/exist/storage/serializers/XIncludeFilter.java @@ -45,6 +45,7 @@ */ package org.exist.storage.serializers; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.Namespaces; @@ -58,19 +59,16 @@ import org.exist.source.DBSource; import org.exist.source.Source; import org.exist.source.StringSource; -import org.exist.storage.XQueryPool; import com.evolvedbinary.j8fu.Either; import org.exist.util.XMLReaderPool; import org.exist.util.serializer.AttrList; import org.exist.util.serializer.Receiver; import org.exist.xmldb.XmldbURI; -import org.exist.xquery.CompiledXQuery; import org.exist.xquery.Constants; import org.exist.xquery.Expression; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; import org.exist.xquery.XQueryContext; -import org.exist.xquery.util.ExpressionDumper; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.NodeValue; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceIterator; @@ -326,7 +324,7 @@ protected Optional processXInclude(final String href, String xpoi //String xpointer = null; //String docName = href; - Map params = null; + final Map params; DocumentImpl doc = null; org.exist.dom.memtree.DocumentImpl memtreeDoc = null; boolean xqueryDoc = false; @@ -338,12 +336,13 @@ protected Optional processXInclude(final String href, String xpoi } // extract possible parameters in the URI - params = null; final String paramStr = docUri.getQuery(); if (paramStr != null) { params = processParameters(paramStr); // strip query part docUri = XmldbURI.create(docUri.getRawCollectionPath()); + } else { + params = null; } // if docName has no collection specified, assume @@ -373,7 +372,10 @@ protected Optional processXInclude(final String href, String xpoi if (doc != null && doc.getResourceType() == DocumentImpl.BINARY_FILE) { xqueryDoc = MediaType.APPLICATION_XQUERY.equals(doc.getMediaType()); } + } else { + params = null; } + // The document could not be found: check if it points to an external resource if (docUri == null || (doc == null && !docUri.isAbsolute())) { try { @@ -433,12 +435,8 @@ protected Optional processXInclude(final String href, String xpoi } } else { // process the xpointer or the stored XQuery - Source source = null; - final XQueryPool pool = serializer.broker.getBrokerPool().getXQueryPool(); - final XQuery xquery = serializer.broker.getBrokerPool().getXQueryService(); - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; try { + Source source = null; if (xpointer == null) { source = new DBSource(serializer.broker.getBrokerPool(), (BinaryDocument) doc, true); } else { @@ -446,66 +444,56 @@ protected Optional processXInclude(final String href, String xpoi source = new StringSource(xpointer); } - compiled = pool.borrowCompiledXQuery(serializer.broker, source); - if (compiled == null) { - context = new XQueryContext(serializer.broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - if (namespaces != null) { - context.declareNamespaces(namespaces); - } - context.declareNamespace("xinclude", Namespaces.XINCLUDE_NS); + final String xpointerCopy = xpointer; + final DocumentImpl docCopy = doc; + final XmldbURI docUriCopy = docUri; + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + if (namespaces != null) { + xqueryContext.declareNamespaces(namespaces); + } + xqueryContext.declareNamespace("xinclude", Namespaces.XINCLUDE_NS); - //setup the http context if known - if (serializer.httpContext != null) { - context.setHttpContext(serializer.httpContext); - } + // Setup the HTTP context if known + if (serializer.httpContext != null) { + xqueryContext.setHttpContext(serializer.httpContext); + } - if (xpointer != null) { - if (doc != null) { - context.setStaticallyKnownDocuments(new XmldbURI[]{doc.getURI()}); - } else if (docUri != null) { - context.setStaticallyKnownDocuments(new XmldbURI[]{docUri}); + if (xpointerCopy != null) { + if (docCopy != null) { + xqueryContext.setStaticallyKnownDocuments(new XmldbURI[]{ docCopy.getURI() }); + } else if (docUriCopy != null) { + xqueryContext.setStaticallyKnownDocuments(new XmldbURI[]{ docUriCopy }); + } } - } + }; - if (compiled == null) { - try { - compiled = xquery.compile(context, source, xpointer != null); - } catch (final IOException e) { - throw new SAXException("I/O error while reading query for xinclude: " + e.getMessage(), e); + final ConsumerE setupXqueryContextPreExecution = xqueryContext -> { + //TODO: change these to putting the XmldbURI in, but we need to warn users! + if (document != null) { + xqueryContext.declareVariable("xinclude:current-doc", true, document.getFileURI().toString()); + xqueryContext.declareVariable("xinclude:current-collection", true, document.getCollection().getURI().toString()); } - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } - LOG.info("xpointer query: {}", ExpressionDumper.dump((Expression) compiled)); - //TODO: change these to putting the XmldbURI in, but we need to warn users! - if (document != null) { - context.declareVariable("xinclude:current-doc", true, document.getFileURI().toString()); - context.declareVariable("xinclude:current-collection", true, document.getCollection().getURI().toString()); - } - // pass parameters as variables - if (params != null) { - for (final Map.Entry entry : params.entrySet()) { - context.declareVariable(entry.getKey(), true, entry.getValue()); + // pass parameters as variables + if (params != null) { + for (final Map.Entry entry : params.entrySet()) { + xqueryContext.declareVariable(entry.getKey(), true, entry.getValue()); + } } - } + }; Sequence contextSeq = null; if (memtreeDoc != null) { contextSeq = memtreeDoc; } - final Sequence seq = xquery.execute(serializer.broker, compiled, contextSeq); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(serializer.broker, source, xpointer != null, true, contextSeq, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); + + final Sequence seq = queryResult.result; if (Type.subTypeOf(seq.getItemType(), Type.NODE)) { if (LOG.isDebugEnabled()) { - LOG.debug("xpointer found: {}", seq.getItemCount()); + LOG.debug("XPointer found: {}", seq.getItemCount()); } NodeValue node; @@ -521,16 +509,9 @@ protected Optional processXInclude(final String href, String xpoi } } - } catch (final XPathException | PermissionDeniedException e) { - LOG.warn("xpointer error", e); + } catch (final XPathException | IOException | PermissionDeniedException e) { + LOG.warn("XPointer error: {}", e.getMessage(), e); throw new SAXException("Error while processing XInclude expression: " + e.getMessage(), e); - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - pool.returnCompiledXQuery(source, compiled); - } } } // restore settings diff --git a/exist-core/src/main/java/org/exist/test/TransactionTestDSL.java b/exist-core/src/main/java/org/exist/test/TransactionTestDSL.java index 3d90057453..46d16510b2 100644 --- a/exist-core/src/main/java/org/exist/test/TransactionTestDSL.java +++ b/exist-core/src/main/java/org/exist/test/TransactionTestDSL.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -32,6 +56,7 @@ import org.exist.dom.persistent.NodeProxy; import org.exist.dom.persistent.NodeSet; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.lock.Lock; @@ -41,7 +66,7 @@ import org.exist.util.LockException; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import java.io.IOException; import java.util.Objects; @@ -623,10 +648,9 @@ static TransactionOperation updateDocument(fin return (broker, transaction, listener, doc) -> { listener.event("Updating document: " + doc.getDocumentURI() + ", with: " + xqueryUpdate); - final XQuery xquery = broker.getBrokerPool().getXQueryService(); final NodeSet nodeSet = new NewArrayNodeSet(); nodeSet.add(new NodeProxy(null, doc)); - xquery.execute(broker, xqueryUpdate, nodeSet); + XQueryUtil.query(broker, new StringSource(xqueryUpdate), false, nodeSet, null, null, null, null); return null; }; } @@ -645,10 +669,9 @@ static TransactionOperation queryDocument(fina return (broker, transaction, listener, doc) -> { listener.event("Querying document: " + doc.getDocumentURI() + ", with: " + query); - final XQuery xquery = broker.getBrokerPool().getXQueryService(); final NodeSet nodeSet = new NewArrayNodeSet(); nodeSet.add(new NodeProxy(null, doc)); - xquery.execute(broker, query, nodeSet); + XQueryUtil.query(broker, new StringSource(query), false, nodeSet, null, null, null, null); return null; }; } diff --git a/exist-core/src/main/java/org/exist/test/XQueryCompilationTest.java b/exist-core/src/main/java/org/exist/test/XQueryCompilationTest.java index 637670a212..e7cd925188 100644 --- a/exist-core/src/main/java/org/exist/test/XQueryCompilationTest.java +++ b/exist-core/src/main/java/org/exist/test/XQueryCompilationTest.java @@ -24,15 +24,19 @@ import com.evolvedbinary.j8fu.Either; import org.exist.EXistException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.xquery.CompiledXQuery; import org.exist.xquery.XPathException; import org.exist.xquery.XQuery; import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.ClassRule; +import java.io.IOException; + import static com.evolvedbinary.j8fu.Either.Left; import static com.evolvedbinary.j8fu.Either.Right; @@ -58,12 +62,13 @@ protected static Either compileQuery(final Strin protected static Either executeQuery(final String string) throws EXistException, PermissionDeniedException { final BrokerPool pool = server.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); try (final DBBroker broker = pool.getBroker()) { try { - return Right(xqueryService.execute(broker, string, null)); + return Right(XQueryUtil.query(broker, new StringSource(string), false, null, null, null, null, null).result); } catch (final XPathException e) { return Left(e); + } catch (final IOException e) { + return Left(new XPathException(e.getMessage(), e)); } } } diff --git a/exist-core/src/main/java/org/exist/test/runner/AbstractTestRunner.java b/exist-core/src/main/java/org/exist/test/runner/AbstractTestRunner.java index 814a17bcc6..98a39f863e 100644 --- a/exist-core/src/main/java/org/exist/test/runner/AbstractTestRunner.java +++ b/exist-core/src/main/java/org/exist/test/runner/AbstractTestRunner.java @@ -45,6 +45,7 @@ */ package org.exist.test.runner; +import com.evolvedbinary.j8fu.function.ConsumerE; import com.evolvedbinary.j8fu.tuple.Tuple2; import org.exist.EXistException; import org.exist.security.PermissionDeniedException; @@ -53,17 +54,14 @@ import org.exist.source.Source; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; import org.exist.util.DatabaseConfigurationException; -import org.exist.xquery.CompiledXQuery; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.AnyURIValue; import org.exist.xquery.value.Sequence; import org.junit.runner.Runner; -import javax.annotation.Nullable; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -89,58 +87,33 @@ protected AbstractTestRunner(final Path path, final boolean parallel) { this.parallel = parallel; } - protected static Sequence executeQuery(final BrokerPool brokerPool, final Source query, final List>> externalVariableBindings) throws EXistException, PermissionDeniedException, XPathException, IOException, DatabaseConfigurationException { - final SecurityManager securityManager = requireNonNull(brokerPool.getSecurityManager(), "securityManager is null"); - try (final DBBroker broker = brokerPool.get(Optional.of(securityManager.getSystemSubject()))) { - final XQueryPool queryPool = brokerPool.getXQueryPool(); - CompiledXQuery compiledQuery = queryPool.borrowCompiledXQuery(broker, query); - - @Nullable XQueryContext context = null; - try { - if (compiledQuery == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiledQuery.getContext(); - context.prepareForReuse(); - } - - // setup misc. context - context.setBaseURI(new AnyURIValue("/db")); - if(query instanceof FileSource) { - final Path queryPath = Paths.get(((FileSource) query).getPath().toAbsolutePath().toString()); - if(Files.isDirectory(queryPath)) { - context.setModuleLoadPath(queryPath.toString()); - } else { - context.setModuleLoadPath(queryPath.getParent().toString()); - } - } - - final XQuery xqueryService = brokerPool.getXQueryService(); + protected static Sequence executeQuery(final BrokerPool brokerPool, final Source source, final List>> externalVariableBindings) throws EXistException, PermissionDeniedException, XPathException, IOException, DatabaseConfigurationException { - // compile or update the context - if (compiledQuery == null) { - compiledQuery = xqueryService.compile(context, query); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + // Setup paths in the context + xqueryContext.setBaseURI(new AnyURIValue("/db")); + if (source instanceof FileSource) { + final Path queryPath = Paths.get(((FileSource) source).getPath().toAbsolutePath().toString()); + if (Files.isDirectory(queryPath)) { + xqueryContext.setModuleLoadPath(queryPath.toString()); } else { - compiledQuery.getContext().updateContext(context); - context.getWatchDog().reset(); + xqueryContext.setModuleLoadPath(queryPath.getParent().toString()); } + } + }; - // declare variables for the query - for(final Function> externalVariableBinding : externalVariableBindings) { - final Tuple2 nameValue = externalVariableBinding.apply(context); - context.declareVariable(nameValue._1, true, nameValue._2); - } + final ConsumerE setupXqueryContextPreExecution = xqueryContext -> { + // Declare variables for the query + for(final Function> externalVariableBinding : externalVariableBindings) { + final Tuple2 nameValue = externalVariableBinding.apply(xqueryContext); + xqueryContext.declareVariable(nameValue._1, true, nameValue._2); + } + }; - return xqueryService.execute(broker, compiledQuery, null); + final SecurityManager securityManager = requireNonNull(brokerPool.getSecurityManager(), "securityManager is null"); - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiledQuery != null) { - queryPool.returnCompiledXQuery(query, compiledQuery); - } - } + try (final DBBroker broker = brokerPool.get(Optional.of(securityManager.getSystemSubject()))) { + return XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null).result; } } diff --git a/exist-core/src/main/java/org/exist/util/serializer/XQuerySerializer.java b/exist-core/src/main/java/org/exist/util/serializer/XQuerySerializer.java index 366e3866cb..e65ee5b931 100644 --- a/exist-core/src/main/java/org/exist/util/serializer/XQuerySerializer.java +++ b/exist-core/src/main/java/org/exist/util/serializer/XQuerySerializer.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -26,6 +50,7 @@ import org.exist.storage.serializers.Serializer; import org.exist.util.serializer.json.JSONSerializer; import org.exist.xquery.XPathException; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.*; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; @@ -61,6 +86,10 @@ public void serialize(final Sequence sequence) throws SAXException, XPathExcepti serialize(sequence, 1, sequence.getItemCount(), false, false, 0, 0); } + public void serialize(final XQueryUtil.QueryResult queryResult, final int start, final int howmany, final boolean wrap, final boolean typed) throws SAXException, XPathException { + serialize(queryResult.result, start, howmany, wrap, typed, queryResult.compilationTime, queryResult.executionTime); + } + public void serialize(final Sequence sequence, final int start, final int howmany, final boolean wrap, final boolean typed, final long compilationTime, final long executionTime) throws SAXException, XPathException { final String method = outputProperties.getProperty(OutputKeys.METHOD, "xml"); switch (method) { diff --git a/exist-core/src/main/java/org/exist/validation/internal/DatabaseResources.java b/exist-core/src/main/java/org/exist/validation/internal/DatabaseResources.java index ea0a065417..814732b067 100644 --- a/exist-core/src/main/java/org/exist/validation/internal/DatabaseResources.java +++ b/exist-core/src/main/java/org/exist/validation/internal/DatabaseResources.java @@ -48,6 +48,7 @@ import java.io.IOException; import java.util.*; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.EXistException; @@ -56,12 +57,12 @@ import org.exist.security.PermissionDeniedException; import org.exist.security.Subject; import org.exist.source.ClassLoaderSource; +import org.exist.source.Source; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; -import org.exist.xquery.CompiledXQuery; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceIterator; @@ -87,12 +88,10 @@ public class DatabaseResources { public final static String CATALOG = "catalog"; public final static String COLLECTION = "collection"; - - /** Local reference to database */ + private BrokerPool brokerPool = null; - - /** Local logger */ - private final static Logger logger = LogManager.getLogger(DatabaseResources.class); + + private static final Logger LOGGER = LogManager.getLogger(DatabaseResources.class); /** @@ -112,7 +111,7 @@ public List getAllResults(Sequence sequence){ } } catch (final XPathException ex) { - logger.error("xQuery issue.", ex); + LOGGER.error("XQuery issue.", ex); result=null; } @@ -133,63 +132,58 @@ public String getFirstResult(Sequence sequence){ if(i.hasNext()){ result= i.nextItem().getStringValue(); - logger.debug("Single query result: '{}'.", result); + LOGGER.debug("Single query result: '{}'.", result); } else { - logger.debug("No query result."); + LOGGER.debug("No query result."); } } catch (final XPathException ex) { - logger.error("xQuery issue ", ex); + LOGGER.error("XQuery issue ", ex); } return result; } - public Sequence executeQuery(final String queryPath, final Map params, final Subject user){ + public @Nullable Sequence executeQuery(final String queryPath, final Map params, final Subject user){ @Nullable final String namespace = params.get(TARGETNAMESPACE); @Nullable final String publicId = params.get(PUBLICID); @Nullable final String catalogPath = params.get(CATALOG); @Nullable final String collection = params.get(COLLECTION); - if(logger.isDebugEnabled()) { - logger.debug("collection={} namespace={} publicId={} catalogPath={}", collection, namespace, publicId, catalogPath); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("collection={} namespace={} publicId={} catalogPath={}", collection, namespace, publicId, catalogPath); } - Sequence result= null; - final XQueryContext context = new XQueryContext(brokerPool); - try(final DBBroker broker = brokerPool.get(Optional.ofNullable(user))) { + try (final DBBroker broker = brokerPool.get(Optional.ofNullable(user))) { - final XQuery xquery = brokerPool.getXQueryService(); - - if (collection != null){ - context.declareVariable(new QName(COLLECTION, Namespaces.XQUERY_LOCAL_NS), true, collection); - } - - if (namespace != null){ - context.declareVariable(new QName(TARGETNAMESPACE, Namespaces.XQUERY_LOCAL_NS), true, namespace); - } - - if (publicId != null){ - context.declareVariable(new QName(PUBLICID, Namespaces.XQUERY_LOCAL_NS), true, publicId); - } - - if (catalogPath != null){ - context.declareVariable(new QName(CATALOG, Namespaces.XQUERY_LOCAL_NS), true, catalogPath); - } - - CompiledXQuery compiled = xquery.compile(context, new ClassLoaderSource(queryPath) ); - - result = xquery.execute(broker, compiled, null); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + if (collection != null) { + xqueryContext.declareVariable(new QName(COLLECTION, Namespaces.XQUERY_LOCAL_NS), true, collection); + } + + if (namespace != null) { + xqueryContext.declareVariable(new QName(TARGETNAMESPACE, Namespaces.XQUERY_LOCAL_NS), true, namespace); + } + + if (publicId != null) { + xqueryContext.declareVariable(new QName(PUBLICID, Namespaces.XQUERY_LOCAL_NS), true, publicId); + } + + if (catalogPath != null) { + xqueryContext.declareVariable(new QName(CATALOG, Namespaces.XQUERY_LOCAL_NS), true, catalogPath); + } + }; + + final Source source = new ClassLoaderSource(queryPath); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, null, null); + return queryResult.result; } catch (final EXistException | XPathException | IOException | PermissionDeniedException ex) { - logger.error("Problem executing xquery", ex); - result= null; - context.runCleanupTasks(); - + LOGGER.error("Problem executing XQuery: {}", ex.getMessage(), ex); + return null; } - return result; } @@ -202,15 +196,15 @@ public Sequence executeQuery(final String queryPath, final Map pa */ public DatabaseResources(BrokerPool pool) { - logger.info("Initializing DatabaseResources"); + LOGGER.info("Initializing DatabaseResources"); this.brokerPool = pool; } public String findXSD(String collection, String targetNamespace, Subject user){ - if(logger.isDebugEnabled()) { - logger.debug("Find schema with namespace '{}' in '{}'.", targetNamespace, collection); + if(LOGGER.isDebugEnabled()) { + LOGGER.debug("Find schema with namespace '{}' in '{}'.", targetNamespace, collection); } final Map params = new HashMap<>(); @@ -224,8 +218,8 @@ public String findXSD(String collection, String targetNamespace, Subject user){ public String findCatalogWithDTD(String collection, String publicId, Subject user){ - if(logger.isDebugEnabled()) { - logger.debug("Find DTD with public '{}' in '{}'.", publicId, collection); + if(LOGGER.isDebugEnabled()) { + LOGGER.debug("Find DTD with public '{}' in '{}'.", publicId, collection); } final Map params = new HashMap<>(); diff --git a/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java b/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java index 637d0d9273..63313ada06 100644 --- a/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java +++ b/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java @@ -45,6 +45,7 @@ */ package org.exist.xmldb; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.EXistException; @@ -57,7 +58,6 @@ import org.exist.source.Source; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; import org.exist.storage.lock.Lock.LockMode; import org.exist.storage.lock.LockedDocumentMap; import org.exist.storage.serializers.EXistOutputKeys; @@ -65,17 +65,16 @@ import org.exist.util.LockException; import org.exist.xmldb.function.LocalXmldbFunction; import org.exist.xquery.CompiledXQuery; -import org.exist.xquery.ExternalModule; -import org.exist.xquery.Variable; -import org.exist.xquery.VariableDeclaration; import org.exist.xquery.XPathException; import org.exist.xquery.XQuery; import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.AnyURIValue; import org.exist.xquery.value.BinaryValue; import org.exist.xquery.value.Sequence; import org.w3c.dom.Node; import org.xmldb.api.base.*; +import org.xmldb.api.base.ErrorCodes; import org.xmldb.api.modules.XMLResource; import java.io.Writer; @@ -91,8 +90,6 @@ import org.exist.security.Permission; import com.evolvedbinary.j8fu.Either; -import javax.annotation.Nullable; - public class LocalXPathQueryService extends AbstractLocalService implements EXistXPathQueryService, EXistXQueryService { private final static Logger LOG = LogManager.getLogger(LocalXPathQueryService.class); @@ -231,7 +228,11 @@ private ResourceSet execute(final DBBroker broker, final Txn transaction, XmldbU declareVariables(context); final XQuery xquery = brokerPool.getXQueryService(); - result = xquery.execute(broker, expr, contextSet, properties); + result = xquery.execute(broker, expr, null, contextSet, properties, true); + if (LOG.isTraceEnabled()) { + LOG.trace("Query took {} ms.", System.currentTimeMillis() - start); + } + } catch (final Exception e) { // need to catch all runtime exceptions here to be able to release locked documents throw new XMLDBException(ErrorCodes.VENDOR_ERROR, e.getMessage(), e); @@ -256,7 +257,7 @@ private ResourceSet execute(final DBBroker broker, final Txn transaction, XmldbU return true; }); } - LOG.debug("query took {} ms.", System.currentTimeMillis() - start); + if(result != null) { final Properties resourceSetProperties = new Properties(properties); resourceSetProperties.setProperty(EXistOutputKeys.XDM_SERIALIZATION, "yes"); @@ -285,54 +286,36 @@ public ResourceSet executeStoredQuery(final String uri) throws XMLDBException { private ResourceSet execute(final LocalXmldbFunction sourceOp) throws XMLDBException { return withDb((broker, transaction) -> { - final long start = System.currentTimeMillis(); - final Source source = sourceOp.apply(broker, transaction); + final XmldbURI[] docs = new XmldbURI[]{ XmldbURI.create(collection.getName(broker, transaction)) }; - final XmldbURI[] docs = new XmldbURI[]{XmldbURI.create(collection.getName(broker, transaction))}; - - final XQuery xquery = brokerPool.getXQueryService(); - final XQueryPool pool = brokerPool.getXQueryPool(); - - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - compiled = pool.borrowCompiledXQuery(broker, source); - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - context.setStaticallyKnownDocuments(docs); - - setupContext(source, context); - - if (compiled == null) { - compiled = xquery.compile(context, source); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.setStaticallyKnownDocuments(docs); + try { + setupContext(source, xqueryContext); + } catch (final XMLDBException e) { + throw new XPathException(e); } + }; - declareVariables(context); + final ConsumerE setupXqueryContextPreExecution = this::declareVariables; - final Sequence result = xquery.execute(broker, compiled, null, properties); - if (LOG.isDebugEnabled()) { - LOG.debug("query took {} ms.", System.currentTimeMillis() - start); - } - final Properties resourceSetProperties = new Properties(properties); - resourceSetProperties.setProperty(EXistOutputKeys.XDM_SERIALIZATION, "yes"); - return result != null ? new LocalResourceSet(user, brokerPool, collection, resourceSetProperties, result, null) : null; - } finally { - if (context != null) { - context.runCleanupTasks(); + final XQueryUtil.QueryResult queryResult; + try { + queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); + if (LOG.isTraceEnabled()) { + LOG.trace("Query took {} ms.", queryResult.executionTime); } - if (compiled != null) { - pool.returnCompiledXQuery(source, compiled); + } catch (final XPathException e) { + if (e.getCause() instanceof XMLDBException) { + throw (XMLDBException) e.getCause(); } + throw e; } + + final Properties resourceSetProperties = new Properties(properties); + resourceSetProperties.setProperty(EXistOutputKeys.XDM_SERIALIZATION, "yes"); + return queryResult.result != null ? new LocalResourceSet(user, brokerPool, collection, resourceSetProperties, queryResult.result, null) : null; }); } diff --git a/exist-core/src/main/java/org/exist/xmlrpc/RpcConnection.java b/exist-core/src/main/java/org/exist/xmlrpc/RpcConnection.java index eb491bda94..070555f949 100644 --- a/exist-core/src/main/java/org/exist/xmlrpc/RpcConnection.java +++ b/exist-core/src/main/java/org/exist/xmlrpc/RpcConnection.java @@ -301,10 +301,14 @@ protected QueryResult doQuery(final DBBroker broker, final CompiledXQuery compil context.setProtectedDocs(lockedDocuments); } final Properties outputProperties = new Properties(); - final Sequence result = xquery.execute(broker, compiled, contextSet, outputProperties); + final Sequence result = xquery.execute(broker, compiled, contextSet, outputProperties, true); + if (LOG.isTraceEnabled()) { + LOG.trace("Query took {} ms.", System.currentTimeMillis() - start); + } + // pass last modified date to the HTTP response HTTPUtils.addLastModifiedHeader(result, context); - LOG.info("query took {}ms.", System.currentTimeMillis() - start); + return new QueryResult(result, outputProperties); } catch (final XPathException e) { return new QueryResult(e); diff --git a/exist-core/src/main/java/org/exist/xquery/XQuery.java b/exist-core/src/main/java/org/exist/xquery/XQuery.java index 6e2b40a038..5239c3364d 100644 --- a/exist-core/src/main/java/org/exist/xquery/XQuery.java +++ b/exist-core/src/main/java/org/exist/xquery/XQuery.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -31,6 +55,8 @@ import java.util.Optional; import java.util.Properties; +import com.evolvedbinary.j8fu.function.BiConsumerE; +import com.evolvedbinary.j8fu.function.ConsumerE; import com.evolvedbinary.j8fu.tuple.Tuple3; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -49,7 +75,6 @@ import org.exist.xquery.parser.XQueryParser; import org.exist.xquery.parser.XQueryTreeParser; import org.exist.xquery.util.ExpressionDumper; -import org.exist.xquery.util.HTTPUtils; import org.exist.xquery.value.Sequence; import javax.annotation.Nullable; @@ -334,21 +359,15 @@ static boolean isLibraryModule(AST ast) { } public Sequence execute(final DBBroker broker, final CompiledXQuery expression, final Sequence contextSequence) throws XPathException, PermissionDeniedException { - return execute(broker, expression, contextSequence, null); + return execute(broker, expression, null, contextSequence, null, true); } - + public Sequence execute(final DBBroker broker, final CompiledXQuery expression, final Sequence contextSequence, final Properties outputProperties) throws XPathException, PermissionDeniedException { - final XQueryContext context = expression.getContext(); - final Sequence result = execute(broker, expression, contextSequence, outputProperties, true); - - //TODO : move this elsewhere ! - HTTPUtils.addLastModifiedHeader(result, context); - - return result; + return execute(broker, expression, null, contextSequence, outputProperties, true); } public Sequence execute(final DBBroker broker, final CompiledXQuery expression, final Sequence contextSequence, final boolean resetContext) throws XPathException, PermissionDeniedException { - return execute(broker, expression, contextSequence, null, resetContext); + return execute(broker, expression, null, contextSequence, null, resetContext); } public Sequence execute(final DBBroker broker, final CompiledXQuery expression, Sequence contextSequence, final Properties outputProperties, final boolean resetContext) throws XPathException, PermissionDeniedException { @@ -483,6 +502,18 @@ public Sequence execute(final DBBroker broker, final CompiledXQuery expression, } } + /** + * Execute an XPath or XQuery. + * + * @param broker the database broker. + * @param expression the XPath or XQuery expression. + * @param contextSequence the context sequence to use when executing the query, or null if there is no context sequence. + * + * @return the result of the query. + * + * @deprecated Use {@link XQueryUtil#query(DBBroker, Source, boolean, Sequence, Properties, ConsumerE, ConsumerE, BiConsumerE)} instead. + */ + @Deprecated public Sequence execute(final DBBroker broker, final String expression, final Sequence contextSequence) throws XPathException, PermissionDeniedException { final XQueryContext context = new XQueryContext(broker.getBrokerPool()); final CompiledXQuery compiled = compile(context, expression); @@ -494,8 +525,20 @@ public Sequence execute(final DBBroker broker, final String expression, final Se // context.runCleanupTasks(); // } } - - public Sequence execute(final DBBroker broker, File file, Sequence contextSequence) throws XPathException, IOException, PermissionDeniedException { + + /** + * Execute an XPath or XQuery. + * + * @param broker the database broker. + * @param file the file containing the XPath or XQuery. + * @param contextSequence the context sequence to use when executing the query, or null if there is no context sequence. + * + * @return the result of the query. + * + * @deprecated Use {@link XQueryUtil#query(DBBroker, Source, boolean, Sequence, Properties, ConsumerE, ConsumerE, BiConsumerE)} instead. + */ + @Deprecated + public Sequence execute(final DBBroker broker, final File file, final Sequence contextSequence) throws XPathException, IOException, PermissionDeniedException { final XQueryContext context = new XQueryContext(broker.getBrokerPool()); final CompiledXQuery compiled = compile(context, new FileSource(file.toPath(), true)); return execute(broker, compiled, contextSequence); diff --git a/exist-core/src/main/java/org/exist/xquery/XQueryUtil.java b/exist-core/src/main/java/org/exist/xquery/XQueryUtil.java new file mode 100644 index 0000000000..27ca775f14 --- /dev/null +++ b/exist-core/src/main/java/org/exist/xquery/XQueryUtil.java @@ -0,0 +1,237 @@ +/* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +package org.exist.xquery; + +import com.evolvedbinary.j8fu.function.BiConsumerE; +import com.evolvedbinary.j8fu.function.ConsumerE; +import com.evolvedbinary.j8fu.function.Function2E; +import org.exist.security.PermissionDeniedException; +import org.exist.source.Source; +import org.exist.storage.BrokerPool; +import org.exist.storage.DBBroker; +import org.exist.storage.XQueryPool; +import org.exist.xquery.value.Sequence; + +import javax.annotation.Nullable; +import java.io.IOException; +import java.util.Properties; + +public class XQueryUtil { + + /** + * Execute an XPath or XQuery. + * + * @param broker the database broker. + * @param source the source of the query. + * @param cacheQuery true if the compiled query should be cached, false otherwise. + * @param contextSequence the context sequence to use when executing the query, or null if there is no context sequence. + * @param outputProperties any output properties, or null. + * @param preCompilationContext access to the XQuery Context pre-compilation, or null if access is not required. + * @param preExecutionContext access to the XQuery Context pre-execution, or null if access is not required. + * @param postExecutionContext access to the XQuery Context post-execution, or null if access is not required. + * + * @return the result of the query and compilation and execution times. + * + * @throws IOException if the source of the query cannot be read. + * @throws PermissionDeniedException if the calling user does not have permission to execute the query. + * @throws XPathException if the query raises an error. + */ + public static XQueryUtil.QueryResult query(final DBBroker broker, final Source source, final boolean cacheQuery, @Nullable final Sequence contextSequence, @Nullable final Properties outputProperties, @Nullable final ConsumerE preCompilationContext, @Nullable final ConsumerE preExecutionContext, @Nullable final BiConsumerE postExecutionContext) throws XPathException, PermissionDeniedException, IOException { + return query(broker, source, false, cacheQuery, contextSequence, outputProperties, preCompilationContext, preExecutionContext, postExecutionContext); + } + + /** + * Execute an XPath or XQuery. + * + * @param broker the database broker. + * @param source the source of the query. + * @param isXPointer true if the query is an XPointer, false otherwise. + * @param cacheQuery true if the compiled query should be cached, false otherwise. + * @param contextSequence the context sequence to use when executing the query, or null if there is no context sequence. + * @param outputProperties any output properties, or null. + * @param preCompilationContext access to the XQuery Context pre-compilation, or null if access is not required. + * @param preExecutionContext access to the XQuery Context pre-execution, or null if access is not required. + * @param postExecutionContext access to the XQuery Context post-execution, or null if access is not required. + * + * @return the result of the query and compilation and execution times. + * + * @throws IOException if the source of the query cannot be read. + * @throws PermissionDeniedException if the calling user does not have permission to execute the query. + * @throws XPathException if the query raises an error. + */ + public static XQueryUtil.QueryResult query(final DBBroker broker, final Source source, final boolean isXPointer, final boolean cacheQuery, @Nullable final Sequence contextSequence, @Nullable final Properties outputProperties, @Nullable final ConsumerE preCompilationContext, @Nullable final ConsumerE preExecutionContext, @Nullable final BiConsumerE postExecutionContext) throws XPathException, PermissionDeniedException, IOException { + final BrokerPool brokerPool = broker.getBrokerPool(); + final XQuery xquery = brokerPool.getXQueryService(); + + @Nullable XQueryPool xqueryPool = null; + @Nullable CompiledXQuery compiledXquery = null; + @Nullable XQueryContext xqueryContext = null; + try { + if (cacheQuery) { + xqueryPool = brokerPool.getXQueryPool(); + compiledXquery = xqueryPool.borrowCompiledXQuery(broker, source); + } else { + xqueryPool = null; + } + + final long compilationTime; + + if (compiledXquery != null) { + xqueryContext = compiledXquery.getContext(); + xqueryContext.prepareForReuse(); + + if (preCompilationContext != null) { + preCompilationContext.accept(xqueryContext); + } + + compiledXquery.getContext().updateContext(xqueryContext); + xqueryContext.getWatchDog().reset(); + + compilationTime = XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY; + + } else { + xqueryContext = new XQueryContext(brokerPool); + + if (preCompilationContext != null) { + preCompilationContext.accept(xqueryContext); + } + + final long compilationStart = System.currentTimeMillis(); + compiledXquery = xquery.compile(xqueryContext, source, isXPointer); + compilationTime = System.currentTimeMillis() - compilationStart; + } + + if (preExecutionContext != null) { + preExecutionContext.accept(xqueryContext); + } + + final long executionStart = System.currentTimeMillis(); + final Sequence result = xquery.execute(broker, compiledXquery, null, contextSequence, outputProperties, true); + final long executionTime = System.currentTimeMillis() - executionStart; + + final QueryResult queryResult = new XQueryUtil.QueryResult(compilationTime, executionTime, result); + + if (postExecutionContext != null) { + postExecutionContext.accept(xqueryContext, queryResult); + } + + return queryResult; + + } finally { + if (xqueryContext != null) { + xqueryContext.runCleanupTasks(); + } + + if (xqueryPool != null && compiledXquery != null) { + xqueryPool.returnCompiledXQuery(source, compiledXquery); + } + } + } + + public static class QueryResult { + public static final int RETRIEVED_CACHED_COMPILED_QUERY = -1; + + public final long compilationTime; + public final long executionTime; + public final Sequence result; + + public QueryResult(final long compilationTime, final long executionTime, final Sequence result) { + this.compilationTime = compilationTime; + this.executionTime = executionTime; + this.result = result; + } + } + + /** + * Compile a query and perform an operation with the compiled query. + * + * @param the type of the result of the operation. + * + * @param broker the database broker. + * @param source the source of the query. + * + * @param op the operation to perform with the compiled query. + * + * @return the result of the operation. + */ + public static T withCompiledQuery(final DBBroker broker, final Source source, final Function2E op) throws XPathException, PermissionDeniedException, IOException { + final BrokerPool pool = broker.getBrokerPool(); + final XQuery xqueryService = pool.getXQueryService(); + final XQueryPool xqueryPool = pool.getXQueryPool(); + final CompiledXQuery compiledQuery = compileQuery(broker, xqueryService, xqueryPool, source); + try { + return op.apply(compiledQuery); + } finally { + if (compiledQuery != null) { + if (compiledQuery.getContext() != null) { + compiledQuery.getContext().runCleanupTasks(); + } + xqueryPool.returnCompiledXQuery(source, compiledQuery); + } + } + } + + private static CompiledXQuery compileQuery(final DBBroker broker, final XQuery xqueryService, final XQueryPool xqueryPool, final Source query) throws PermissionDeniedException, XPathException, IOException { + @Nullable CompiledXQuery compiled = null; + @Nullable XQueryContext context = null; + try { + compiled = xqueryPool.borrowCompiledXQuery(broker, query); + if (compiled == null) { + context = new XQueryContext(broker.getBrokerPool()); + } else { + context = compiled.getContext(); + context.prepareForReuse(); + } + + if (compiled == null) { + compiled = xqueryService.compile(context, query); + } else { + compiled.getContext().updateContext(context); + context.getWatchDog().reset(); + } + + return compiled; + + } catch (final PermissionDeniedException | XPathException | IOException e) { + if (context != null) { + context.runCleanupTasks(); + } + if (compiled != null) { + xqueryPool.returnCompiledXQuery(query, compiled); + } + throw e; + } + } + + /** + * Execute a compiled query. + * + * @param broker the database broker. + * @param compiledXQuery the compiled query. + * + * @return the result sequence. + */ + public static Sequence executeQuery(final DBBroker broker, final CompiledXQuery compiledXQuery) throws PermissionDeniedException, XPathException { + final BrokerPool pool = broker.getBrokerPool(); + final XQuery xqueryService = pool.getXQueryService(); + return xqueryService.execute(broker, compiledXQuery, null, null, null, true); + } +} diff --git a/exist-core/src/main/java/org/exist/xquery/util/HTTPUtils.java b/exist-core/src/main/java/org/exist/xquery/util/HTTPUtils.java index b9c8f020b2..2314c22534 100644 --- a/exist-core/src/main/java/org/exist/xquery/util/HTTPUtils.java +++ b/exist-core/src/main/java/org/exist/xquery/util/HTTPUtils.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -23,7 +47,6 @@ import java.util.Iterator; -import java.util.Optional; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -34,7 +57,9 @@ import org.exist.xquery.XQueryContext; import org.exist.xquery.value.Sequence; -/** A place holder for static utility functions related to HTTP. +import javax.annotation.Nullable; + +/** A place-holder for static utility functions related to HTTP. * @author jmv */ public class HTTPUtils { private final static Logger LOG = LogManager.getLogger(XQuery.class); @@ -48,8 +73,16 @@ public class HTTPUtils { * @param result the XQuery result to inspect * @param context current context */ - public static void addLastModifiedHeader(Sequence result, - XQueryContext context) { + public static void addLastModifiedHeader(final Sequence result, final XQueryContext context) { + if (context.getHttpContext() == null) { + return; + } + + @Nullable final ResponseWrapper response = context.getHttpContext().getResponse(); + if (response == null) { + return; + } + try { final DocumentSet documentSet = result.getDocumentSet(); long mostRecentDocumentTime = 0; @@ -58,24 +91,18 @@ public static void addLastModifiedHeader(Sequence result, if (doc != null) { mostRecentDocumentTime = Math.max(doc.getLastModified(), mostRecentDocumentTime); -// LOG.debug("getFileName: " + doc.getFileName() + ", " -// + doc.getLastModified()); + if (LOG.isDebugEnabled()) { + LOG.debug("URI: " + doc.getURI() + " modified: " + doc.getLastModified()); + } } } LOG.debug("mostRecentDocumentTime: {}", mostRecentDocumentTime); if (mostRecentDocumentTime > 0) { - - final Optional maybeResponse = Optional.ofNullable(context.getHttpContext()) - .map(XQueryContext.HttpContext::getResponse); - - if (maybeResponse.isPresent()) { - // have to take in account that if the header has allready been explicitely set - // by the XQuery script, we should not modify it . - final ResponseWrapper responseWrapper = maybeResponse.get(); - if (responseWrapper.getDateHeader("Last-Modified") == 0) { - responseWrapper.setDateHeader("Last-Modified", mostRecentDocumentTime); - } + // have to take in account that if the header has already been explicitly set + // by the XQuery script, we should not modify it . + if (response.getDateHeader("Last-Modified") == 0) { + response.setDateHeader("Last-Modified", mostRecentDocumentTime); } } } catch (final Exception e) { diff --git a/exist-core/src/main/java/org/exist/xupdate/Conditional.java b/exist-core/src/main/java/org/exist/xupdate/Conditional.java index cfb51dd549..16c6b66a7e 100644 --- a/exist-core/src/main/java/org/exist/xupdate/Conditional.java +++ b/exist-core/src/main/java/org/exist/xupdate/Conditional.java @@ -50,6 +50,7 @@ import java.util.List; import java.util.Map; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.exist.EXistException; import org.exist.collections.triggers.TriggerException; import org.exist.dom.persistent.DocumentSet; @@ -57,13 +58,11 @@ import org.exist.source.Source; import org.exist.source.StringSource; import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; import org.exist.storage.txn.Txn; import org.exist.util.LockException; -import org.exist.xquery.CompiledXQuery; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import javax.annotation.Nullable; @@ -96,61 +95,40 @@ public long process(final Txn transaction) throws PermissionDeniedException, Loc LOG.debug("Processing xupdate:if ..."); } - final XQuery xquery = broker.getBrokerPool().getXQueryService(); - final XQueryPool pool = broker.getBrokerPool().getXQueryPool(); final Source source = new StringSource(selectStmt); - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.setStaticallyKnownDocuments(docs); + declareNamespaces(xqueryContext); + }; + + final ConsumerE setupXqueryContextPreExecution = xqueryContext -> { + declareVariables(xqueryContext); + }; + + final XQueryUtil.QueryResult queryResult; try { - compiled = pool.borrowCompiledXQuery(broker, source); - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } + queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); + } catch (final IOException e) { + throw new EXistException("An exception occurred while compiling the query: " + e.getMessage()); + } - //context.setBackwardsCompatibility(true); - context.setStaticallyKnownDocuments(docs); - declareNamespaces(context); - - if (compiled == null) { - try { - compiled = xquery.compile(context, source); - } catch (final IOException e) { - throw new EXistException("An exception occurred while compiling the query: " + e.getMessage()); - } - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); + final Sequence seq = queryResult.result; + if (seq.effectiveBooleanValue()) { + long mods = 0; + for (final Modification modification : modifications) { + mods += modification.process(transaction); + broker.flush(); } - declareVariables(context); - - final Sequence seq = xquery.execute(broker, compiled, null); - if (seq.effectiveBooleanValue()) { - long mods = 0; - for (final Modification modification : modifications) { - mods += modification.process(transaction); - broker.flush(); - } + if (LOG.isDebugEnabled()) { + LOG.debug("{} modifications processed.", mods); + } - if (LOG.isDebugEnabled()) { - LOG.debug("{} modifications processed.", mods); - } + return mods; - return mods; - } else { - return 0; - } - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - pool.returnCompiledXQuery(source, compiled); - } + } else { + return 0; } } diff --git a/exist-core/src/main/java/org/exist/xupdate/Modification.java b/exist-core/src/main/java/org/exist/xupdate/Modification.java index 4a7f2dea81..6231d80e0a 100644 --- a/exist-core/src/main/java/org/exist/xupdate/Modification.java +++ b/exist-core/src/main/java/org/exist/xupdate/Modification.java @@ -49,6 +49,7 @@ import java.util.Iterator; import java.util.Map; +import com.evolvedbinary.j8fu.function.ConsumerE; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; @@ -71,14 +72,12 @@ import org.exist.source.Source; import org.exist.source.StringSource; import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; import org.exist.storage.lock.ManagedDocumentLock; import org.exist.storage.txn.Txn; import org.exist.util.LockException; -import org.exist.xquery.CompiledXQuery; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.Type; import org.w3c.dom.Attr; @@ -175,55 +174,32 @@ public void setContent(final NodeList nodes) { * @throws XPathException if the XPath raises an error */ protected NodeList select(final DocumentSet docs) throws PermissionDeniedException, EXistException, XPathException { - final XQuery xquery = broker.getBrokerPool().getXQueryService(); - final XQueryPool pool = broker.getBrokerPool().getXQueryPool(); final Source source = new StringSource(selectStmt); - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - compiled = pool.borrowCompiledXQuery(broker, source); - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - context.setStaticallyKnownDocuments(docs); - declareNamespaces(context); - - declareVariables(context); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.setStaticallyKnownDocuments(docs); + declareNamespaces(xqueryContext); + declareVariables(xqueryContext); + }; - if (compiled == null) { - try { - compiled = xquery.compile(context, source); - } catch (final IOException e) { - throw new EXistException("An exception occurred while compiling the query: " + e.getMessage()); - } - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } + final XQueryUtil.QueryResult queryResult; + try { + queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, null, null); + } catch (final IOException e) { + throw new EXistException("An exception occurred while compiling the query: " + e.getMessage()); + } - final Sequence resultSeq = xquery.execute(broker, compiled, null); - if (!(resultSeq.isEmpty() || Type.subTypeOf(resultSeq.getItemType(), Type.NODE))) { - throw new EXistException("select expression should evaluate to a node-set; got " + - Type.getTypeName(resultSeq.getItemType())); - } + final Sequence resultSeq = queryResult.result; + if (!(resultSeq.isEmpty() || Type.subTypeOf(resultSeq.getItemType(), Type.NODE))) { + throw new EXistException("select expression should evaluate to a node-set; got " + + Type.getTypeName(resultSeq.getItemType())); + } - if (LOG.isDebugEnabled()) { - LOG.debug("found {} for select: {}", resultSeq.getItemCount(), selectStmt); - } + if (LOG.isDebugEnabled()) { + LOG.debug("found {} for select: {}", resultSeq.getItemCount(), selectStmt); + } - return resultSeq.toNodeSet(); - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - pool.returnCompiledXQuery(source, compiled); - } - } + return resultSeq.toNodeSet(); } /** diff --git a/exist-core/src/main/java/org/exist/xupdate/XUpdateProcessor.java b/exist-core/src/main/java/org/exist/xupdate/XUpdateProcessor.java index 339ea8a6ce..aeabc390f7 100644 --- a/exist-core/src/main/java/org/exist/xupdate/XUpdateProcessor.java +++ b/exist-core/src/main/java/org/exist/xupdate/XUpdateProcessor.java @@ -51,9 +51,7 @@ */ package org.exist.xupdate; -import antlr.RecognitionException; -import antlr.TokenStreamException; -import antlr.collections.AST; +import com.evolvedbinary.j8fu.function.ConsumerE; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import it.unimi.dsi.fastutil.objects.Object2ObjectRBTreeMap; import org.apache.logging.log4j.LogManager; @@ -63,15 +61,13 @@ import org.exist.dom.persistent.DocumentSet; import org.exist.dom.NodeListImpl; import org.exist.dom.persistent.NodeSetHelper; +import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.DBBroker; -import org.exist.xquery.AnalyzeContextInfo; import org.exist.xquery.Constants; -import org.exist.xquery.PathExpr; import org.exist.xquery.XPathException; import org.exist.xquery.XQueryContext; -import org.exist.xquery.parser.XQueryLexer; -import org.exist.xquery.parser.XQueryParser; -import org.exist.xquery.parser.XQueryTreeParser; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Item; import org.exist.xquery.value.NodeValue; import org.exist.xquery.value.Sequence; @@ -98,7 +94,6 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; -import java.io.StringReader; import java.util.*; /** @@ -755,65 +750,35 @@ private void createVariable(final String name, final String select) throws SAXEx } private Sequence processQuery(final String select) throws SAXException { - XQueryContext context = null; - try { - context = new XQueryContext(broker.getBrokerPool()); - context.setStaticallyKnownDocuments(documentSet); - - context.declareNamespace(XUPDATE_PREFIX, XUPDATE_NS); - if (namespaces != null) { - for (final Map.Entry namespace : namespaces.entrySet()) { - final String prefix = namespace.getKey(); - final String uri = namespace.getValue(); - // NOTE(AR) guard against declaring XUpdate as the default namespace prefix - if (!(XMLConstants.DEFAULT_NS_PREFIX.equals(prefix) && XUPDATE_NS.equals(uri))) { - context.declareNamespace(prefix, uri); - } - } - } - - // TODO(pkaminsk2): why replicate XQuery.compile here? - final XQueryLexer lexer = new XQueryLexer(context, new StringReader(select)); - final XQueryParser parser = new XQueryParser(lexer); - final XQueryTreeParser treeParser = new XQueryTreeParser(context); - parser.xpath(); - if (parser.foundErrors()) { - throw new SAXException(parser.getErrorMessage()); - } - final AST ast = parser.getAST(); - - if (LOG.isDebugEnabled()) { - LOG.debug("Generated AST: {}", ast.toStringTree()); - } - - final PathExpr expr = new PathExpr(context); - treeParser.xpath(ast, expr); - if (treeParser.foundErrors()) { - throw new SAXException(treeParser.getErrorMessage()); - } - - if (variables != null) { - for (final Map.Entry variable : variables.entrySet()) { - context.declareVariable(variable.getKey(), true, variable.getValue()); - } - } + try { + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.setStaticallyKnownDocuments(documentSet); + + xqueryContext.declareNamespace(XUPDATE_PREFIX, XUPDATE_NS); + if (namespaces != null) { + for (final Map.Entry namespace : namespaces.entrySet()) { + final String prefix = namespace.getKey(); + final String uri = namespace.getValue(); + // NOTE(AR) guard against declaring XUpdate as the default namespace prefix + if (!(XMLConstants.DEFAULT_NS_PREFIX.equals(prefix) && XUPDATE_NS.equals(uri))) { + xqueryContext.declareNamespace(prefix, uri); + } + } + } - expr.analyze(new AnalyzeContextInfo()); - final Sequence seq = expr.eval(null, null); - return seq; + if (variables != null) { + for (final Map.Entry variable : variables.entrySet()) { + xqueryContext.declareVariable(variable.getKey(), true, variable.getValue()); + } + } + }; - } catch (final RecognitionException | TokenStreamException e) { - LOG.warn("Error while creating variable", e); - throw new SAXException(e); - } catch (final XPathException e) { + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(select), false, null, null, setupXqueryContextPreCompilation, null, null); + return queryResult.result; + } catch (final IOException | PermissionDeniedException | XPathException e) { throw new SAXException(e); - } finally { - if (context != null) { - context.reset(false); - context.runCleanupTasks(); - } - } + } } @Override diff --git a/exist-core/src/test/java/org/exist/Indexer2Test.java b/exist-core/src/test/java/org/exist/Indexer2Test.java index d4a5dbefd8..c2999384e2 100644 --- a/exist-core/src/test/java/org/exist/Indexer2Test.java +++ b/exist-core/src/test/java/org/exist/Indexer2Test.java @@ -54,6 +54,7 @@ import org.exist.collections.Collection; import org.exist.security.AuthenticationException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.txn.TransactionManager; @@ -65,7 +66,7 @@ import org.exist.util.StringInputSource; import org.exist.util.serializer.SAXSerializer; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Item; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceIterator; @@ -132,10 +133,10 @@ public void retrieve_boundary_space_preserve_with_preserve_mixed_ws() throws EXi private String executeQuery() throws EXistException, PermissionDeniedException, SAXException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); - final StringBuilderWriter out = new StringBuilderWriter()) { - final XQuery xquery = broker.getBrokerPool().getXQueryService(); - final Sequence result = xquery.execute(broker, XQUERY, null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + final StringBuilderWriter out = new StringBuilderWriter()) { + + final Sequence result = XQueryUtil.query(broker, new StringSource(XQUERY), false, null, null, null, null, null).result; final Properties props = new Properties(); props.setProperty(OutputKeys.INDENT, "yes"); final SAXSerializer serializer = new SAXSerializer(out, props); diff --git a/exist-core/src/test/java/org/exist/Indexer3Test.java b/exist-core/src/test/java/org/exist/Indexer3Test.java index 138318c4ef..2eea0647b1 100644 --- a/exist-core/src/test/java/org/exist/Indexer3Test.java +++ b/exist-core/src/test/java/org/exist/Indexer3Test.java @@ -54,6 +54,7 @@ import org.exist.collections.Collection; import org.exist.security.AuthenticationException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.txn.TransactionManager; @@ -64,7 +65,7 @@ import org.exist.util.StringInputSource; import org.exist.util.serializer.SAXSerializer; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Item; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceIterator; @@ -376,8 +377,8 @@ private String store_and_retrieve_suppress_type(final String type, final String final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final StringBuilderWriter out = new StringBuilderWriter()) { - final XQuery xquery = pool.getXQueryService(); - final Sequence result = xquery.execute(broker, typeXquery, null); + + final Sequence result = XQueryUtil.query(broker, new StringSource(typeXquery), false, null, null, null, null, null).result; final Properties props = new Properties(); props.setProperty(OutputKeys.INDENT, "no"); final SAXSerializer serializer = new SAXSerializer(out, props); diff --git a/exist-core/src/test/java/org/exist/IndexerTest.java b/exist-core/src/test/java/org/exist/IndexerTest.java index b9c50eb335..540f1693b0 100644 --- a/exist-core/src/test/java/org/exist/IndexerTest.java +++ b/exist-core/src/test/java/org/exist/IndexerTest.java @@ -54,6 +54,7 @@ import org.exist.collections.Collection; import org.exist.security.AuthenticationException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.txn.TransactionManager; @@ -64,7 +65,7 @@ import org.exist.util.StringInputSource; import org.exist.util.serializer.SAXSerializer; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Item; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceIterator; @@ -215,10 +216,10 @@ private void store_preserve_ws_mixed_content_value(final boolean propValue, fina private String store_and_retrieve_ws_mixed_content_value(final boolean preserve, final String typeXml, final String typeXquery) throws EXistException, IOException, LockException, AuthenticationException, PermissionDeniedException, SAXException, XPathException { store_preserve_ws_mixed_content_value(preserve, typeXml); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = pool.getXQueryService(); - final Sequence result = xquery.execute(broker, typeXquery, null); - try(final StringBuilderWriter out = new StringBuilderWriter()) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + + final Sequence result = XQueryUtil.query(broker, new StringSource(typeXquery), false, null, null, null, null, null).result; + try (final StringBuilderWriter out = new StringBuilderWriter()) { final Properties props = new Properties(); props.setProperty(OutputKeys.INDENT, "yes"); final SAXSerializer serializer = new SAXSerializer(out, props); diff --git a/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetGidTest.java b/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetGidTest.java index 39fbb27d31..ff7d081053 100644 --- a/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetGidTest.java +++ b/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetGidTest.java @@ -61,7 +61,7 @@ import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.value.Sequence; +import org.exist.xquery.XQueryUtil; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; @@ -201,22 +201,15 @@ public void triggerSetGid() throws EXistException, PermissionDeniedException, IO try (final Txn transaction = pool.getTransactionManager().beginTransaction(); final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final String beforeRealGroup = withCompiledQuery(broker, new StringSource(queryBeforeRealGroup), compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertNotNull(result); - assertEquals(1, result.getItemCount()); + XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryBeforeRealGroup), false, null, null, null, null, null); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + assertEquals(GUEST_GROUP, queryResult.result.itemAt(0).getStringValue()); - return result.itemAt(0).getStringValue(); - }); - assertEquals(GUEST_GROUP, beforeRealGroup); - - final String beforeEffectiveGroup = withCompiledQuery(broker, new StringSource(queryBeforeEffectiveGroup), compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertNotNull(result); - assertEquals(2, result.getItemCount()); - return result.itemAt(0).getStringValue() + "," + result.itemAt(1).getStringValue(); - }); - assertEquals(DBA_GROUP + "," + GUEST_GROUP, beforeEffectiveGroup); + queryResult = XQueryUtil.query(broker, new StringSource(queryBeforeEffectiveGroup), false, null, null, null, null, null); + assertNotNull(queryResult.result); + assertEquals(2, queryResult.result.getItemCount()); + assertEquals(DBA_GROUP + "," + GUEST_GROUP, queryResult.result.itemAt(0).getStringValue() + "," + queryResult.result.itemAt(1).getStringValue()); transaction.commit(); } @@ -232,22 +225,15 @@ public void triggerSetGid() throws EXistException, PermissionDeniedException, IO try (final Txn transaction = pool.getTransactionManager().beginTransaction(); final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final String afterRealGroup = withCompiledQuery(broker, new StringSource(queryAfterRealGroup), compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertNotNull(result); - assertEquals(1, result.getItemCount()); - - return result.itemAt(0).getStringValue(); - }); - assertEquals(GUEST_GROUP, afterRealGroup); - - final String afterEffectiveGroup = withCompiledQuery(broker, new StringSource(queryAfterEffectiveGroup), compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertNotNull(result); - assertEquals(2, result.getItemCount()); - return result.itemAt(0).getStringValue() + "," + result.itemAt(1).getStringValue(); - }); - assertEquals(DBA_GROUP + "," + GUEST_GROUP, afterEffectiveGroup); + XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryAfterRealGroup), false, null, null, null, null, null); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + assertEquals(GUEST_GROUP, queryResult.result.itemAt(0).getStringValue()); + + queryResult = XQueryUtil.query(broker, new StringSource(queryAfterEffectiveGroup), false, null, null, null, null, null); + assertNotNull(queryResult.result); + assertEquals(2, queryResult.result.getItemCount()); + assertEquals(DBA_GROUP + "," + GUEST_GROUP, queryResult.result.itemAt(0).getStringValue() + "," + queryResult.result.itemAt(1).getStringValue()); transaction.commit(); } diff --git a/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetUidTest.java b/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetUidTest.java index 557f5bafc1..35d4158758 100644 --- a/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetUidTest.java +++ b/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetUidTest.java @@ -61,7 +61,7 @@ import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.value.Sequence; +import org.exist.xquery.XQueryUtil; import org.junit.*; import org.xml.sax.SAXException; import xyz.elemental.mediatype.MediaType; @@ -201,23 +201,16 @@ public void triggerSetUid() throws EXistException, PermissionDeniedException, IO try (final Txn transaction = pool.getTransactionManager().beginTransaction(); final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final String beforeRealUser = withCompiledQuery(broker, new StringSource(queryBeforeRealUser), compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertNotNull(result); - assertEquals(1, result.getItemCount()); + XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryBeforeRealUser), false, null, null, null, null, null); - return result.itemAt(0).getStringValue(); - }); - assertEquals(GUEST_USER, beforeRealUser); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + assertEquals(GUEST_USER, queryResult.result.itemAt(0).getStringValue()); - final String beforeEffectiveUser = withCompiledQuery(broker, new StringSource(queryBeforeEffectiveUser), compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertNotNull(result); - assertEquals(1, result.getItemCount()); - - return result.itemAt(0).getStringValue(); - }); - assertEquals(DBA_USER, beforeEffectiveUser); + queryResult = XQueryUtil.query(broker, new StringSource(queryBeforeEffectiveUser), false, null, null, null, null, null); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + assertEquals(DBA_USER, queryResult.result.itemAt(0).getStringValue()); transaction.commit(); } @@ -233,23 +226,15 @@ public void triggerSetUid() throws EXistException, PermissionDeniedException, IO try (final Txn transaction = pool.getTransactionManager().beginTransaction(); final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final String afterRealUser = withCompiledQuery(broker, new StringSource(queryAfterRealUser), compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertNotNull(result); - assertEquals(1, result.getItemCount()); - - return result.itemAt(0).getStringValue(); - }); - assertEquals(GUEST_USER, afterRealUser); - - final String afterEffectiveUser = withCompiledQuery(broker, new StringSource(queryAfterEffectiveUser), compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertNotNull(result); - assertEquals(1, result.getItemCount()); + XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryAfterRealUser), false, null, null, null, null, null); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + assertEquals(GUEST_USER, queryResult.result.itemAt(0).getStringValue()); - return result.itemAt(0).getStringValue(); - }); - assertEquals(DBA_USER, afterEffectiveUser); + queryResult = XQueryUtil.query(broker, new StringSource(queryAfterEffectiveUser), false, null, null, null, null, null); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + assertEquals(DBA_USER, queryResult.result.itemAt(0).getStringValue()); transaction.commit(); } diff --git a/exist-core/src/test/java/org/exist/dom/memtree/DOMIndexerTest.java b/exist-core/src/test/java/org/exist/dom/memtree/DOMIndexerTest.java index ec6fd993f8..764f175e7d 100644 --- a/exist-core/src/test/java/org/exist/dom/memtree/DOMIndexerTest.java +++ b/exist-core/src/test/java/org/exist/dom/memtree/DOMIndexerTest.java @@ -57,6 +57,7 @@ import org.exist.collections.Collection; import org.exist.security.AuthenticationException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.txn.TransactionManager; @@ -68,7 +69,7 @@ import org.exist.util.serializer.SAXSerializer; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Item; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceIterator; @@ -144,11 +145,10 @@ public void store() throws PermissionDeniedException, IOException, EXistExceptio @Test public void xQuery() throws EXistException, PermissionDeniedException, SAXException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final StringBuilderWriter out = new StringBuilderWriter()) { - final XQuery xquery = pool.getXQueryService(); - final Sequence result = xquery.execute(broker, XQUERY, null); - final int count = result.getItemCount(); + + final Sequence result = XQueryUtil.query(broker, new StringSource(XQUERY), false, null, null, null, null, null).result; final Properties props = new Properties(); props.setProperty(OutputKeys.INDENT, "yes"); final SAXSerializer serializer = new SAXSerializer(out, props); diff --git a/exist-core/src/test/java/org/exist/dom/persistent/BasicNodeSetTest.java b/exist-core/src/test/java/org/exist/dom/persistent/BasicNodeSetTest.java index 2f79920652..9d0e89705b 100644 --- a/exist-core/src/test/java/org/exist/dom/persistent/BasicNodeSetTest.java +++ b/exist-core/src/test/java/org/exist/dom/persistent/BasicNodeSetTest.java @@ -50,11 +50,21 @@ import org.exist.collections.triggers.TriggerException; import org.exist.dom.QName; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.lock.Lock; import org.exist.test.ExistEmbeddedServer; import org.exist.util.LockException; import org.exist.util.StringInputSource; import org.exist.util.io.InputStreamUtil; +import org.exist.xquery.AncestorSelector; +import org.exist.xquery.ChildSelector; +import org.exist.xquery.Constants; +import org.exist.xquery.DescendantOrSelfSelector; +import org.exist.xquery.DescendantSelector; +import org.exist.xquery.NameTest; +import org.exist.xquery.NodeSelector; +import org.exist.xquery.XPathException; +import org.exist.xquery.XQueryUtil; import org.junit.AfterClass; import org.junit.BeforeClass; import org.exist.collections.Collection; @@ -65,15 +75,6 @@ import org.exist.storage.txn.TransactionManager; import org.exist.storage.txn.Txn; import org.exist.xmldb.XmldbURI; -import org.exist.xquery.AncestorSelector; -import org.exist.xquery.ChildSelector; -import org.exist.xquery.Constants; -import org.exist.xquery.DescendantOrSelfSelector; -import org.exist.xquery.DescendantSelector; -import org.exist.xquery.NameTest; -import org.exist.xquery.NodeSelector; -import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; import org.exist.xquery.value.Item; import org.exist.xquery.value.NodeValue; import org.exist.xquery.value.Sequence; @@ -173,7 +174,7 @@ public void ancestorSelector_self() throws XPathException, EXistException { } @Test - public void descendantSelector() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void descendantSelector() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { Sequence seq = executeQuery(broker, "//SCENE", 72, null); NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); @@ -185,7 +186,7 @@ public void descendantSelector() throws XPathException, SAXException, Permission } @Test - public void selectParentChild() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void selectParentChild() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); @@ -199,7 +200,7 @@ public void selectParentChild() throws XPathException, SAXException, PermissionD } @Test - public void selectParentChild_2() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void selectParentChild_2() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); @@ -211,7 +212,7 @@ public void selectParentChild_2() throws XPathException, SAXException, Permissio } @Test - public void selectAncestorDescendant() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void selectAncestorDescendant() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); @@ -223,7 +224,7 @@ public void selectAncestorDescendant() throws XPathException, SAXException, Perm } @Test - public void selectAncestorDescendant_2() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void selectAncestorDescendant_2() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { Sequence outerSet = executeQuery(broker, "//SCENE/TITLE[fn:contains(., 'closet')]/ancestor::SCENE", 1, null); @@ -234,7 +235,7 @@ public void selectAncestorDescendant_2() throws XPathException, SAXException, Pe @Test - public void getParents() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void getParents() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { Sequence largeSet = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'love')]/ancestor::SPEECH", 187, null); @@ -244,7 +245,7 @@ public void getParents() throws XPathException, SAXException, PermissionDeniedEx } @Test - public void selectAncestors() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void selectAncestors() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { NameTest test = new NameTest(Type.ELEMENT, new QName("SCENE", "")); try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { NodeSet scenes = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); @@ -290,7 +291,7 @@ public void getElementsByTagNameWildcardNS() throws LockException, PermissionDen } @Test - public void nodeProxy_getParents() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void nodeProxy_getParents() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { Sequence smallSet = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'perturbed spirit')]/ancestor::SPEECH", 1, null); @@ -308,7 +309,7 @@ public void nodeProxy_getParents() throws XPathException, SAXException, Permissi } @Test - public void selectFollowingSiblings() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void selectFollowingSiblings() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { Sequence largeSet = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'love')]/ancestor::SPEECH/SPEAKER", 187, null); NameTest test = new NameTest(Type.ELEMENT, new QName("LINE", "")); @@ -320,7 +321,7 @@ public void selectFollowingSiblings() throws XPathException, SAXException, Permi } @Test - public void selectPrecedingSiblings() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void selectPrecedingSiblings() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); @@ -332,7 +333,7 @@ public void selectPrecedingSiblings() throws XPathException, SAXException, Permi } @Test - public void extArrayNodeSet_selectParentChild_1() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void extArrayNodeSet_selectParentChild_1() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { Sequence nestedSet = executeQuery(broker, "//section[@n = ('1.1', '1.1.1')]", 2, null); NameTest test = new NameTest(Type.ELEMENT, new QName("para", "")); @@ -344,7 +345,7 @@ public void extArrayNodeSet_selectParentChild_1() throws XPathException, SAXExce } @Test - public void extArrayNodeSet_selectParentChild_2() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void extArrayNodeSet_selectParentChild_2() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { Sequence nestedSet = executeQuery(broker, "//section[@n = ('1.1', '1.1.2', '1.2')]", 3, null); NameTest test = new NameTest(Type.ELEMENT, new QName("para", "")); @@ -356,7 +357,7 @@ public void extArrayNodeSet_selectParentChild_2() throws XPathException, SAXExce } @Test - public void extArrayNodeSet_selectParentChild_3() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void extArrayNodeSet_selectParentChild_3() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { Sequence nestedSet = executeQuery(broker, "//section[@n = ('1.1', '1.1.1', '1.2')]", 3, null); NameTest test = new NameTest(Type.ELEMENT, new QName("para", "")); @@ -368,7 +369,7 @@ public void extArrayNodeSet_selectParentChild_3() throws XPathException, SAXExce } @Test - public void extArrayNodeSet_selectParentChild_4() throws XPathException, SAXException, PermissionDeniedException, EXistException { + public void extArrayNodeSet_selectParentChild_4() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { Sequence nestedSet = executeQuery(broker, "//para[@n = ('1.1.2.1')]", 1, null); NameTest test = new NameTest(Type.ELEMENT, new QName("section", "")); @@ -380,7 +381,7 @@ public void extArrayNodeSet_selectParentChild_4() throws XPathException, SAXExce } @Test - public void testOptimizations() throws XPathException, SAXException, PermissionDeniedException, EXistException, LockException { + public void testOptimizations() throws XPathException, SAXException, PermissionDeniedException, EXistException, LockException, IOException { try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { DocumentSet docs = root.allDocs(broker, new DefaultDocumentSet(), true); @@ -448,85 +449,84 @@ public void testOptimizations() throws XPathException, SAXException, PermissionD } @Test - public void virtualNodeSet_1() throws XPathException, SAXException, PermissionDeniedException, EXistException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + public void virtualNodeSet_1() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { executeQuery(broker, "//*/LINE", 9492, null); } } @Test - public void virtualNodeSet_2() throws XPathException, SAXException, PermissionDeniedException, EXistException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + public void virtualNodeSet_2() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { executeQuery(broker, "//*/LINE/*", 61, null); } } @Test - public void virtualNodeSet_3() throws XPathException, SAXException, PermissionDeniedException, EXistException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + public void virtualNodeSet_3() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { executeQuery(broker, "//*/LINE/text()", 9485, null); } } @Test - public void virtualNodeSet_4() throws XPathException, SAXException, PermissionDeniedException, EXistException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + public void virtualNodeSet_4() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { executeQuery(broker, "//SCENE/*/LINE", 9464, null); } } @Test - public void virtualNodeSet_5() throws XPathException, SAXException, PermissionDeniedException, EXistException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + public void virtualNodeSet_5() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { executeQuery(broker, "//SCENE/*[fn:contains(LINE, 'spirit')]", 30, null); } } @Test - public void virtualNodeSet_6() throws XPathException, SAXException, PermissionDeniedException, EXistException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + public void virtualNodeSet_6() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { executeQuery(broker, "//SCENE/*[fn:contains(LINE, 'the')]", 1313, null); } } @Test - public void virtualNodeSet_7() throws XPathException, SAXException, PermissionDeniedException, EXistException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + public void virtualNodeSet_7() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { executeQuery(broker, "//SCENE/*/LINE[fn:contains(., 'the')]", 3198, null); } } @Test - public void virtualNodeSet_8() throws XPathException, SAXException, PermissionDeniedException, EXistException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + public void virtualNodeSet_8() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { executeQuery(broker, "//SCENE[fn:contains(., 'spirit')]/ancestor::*", 16, null); } } @Test - public void virtualNodeSet_9() throws XPathException, SAXException, PermissionDeniedException, EXistException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + public void virtualNodeSet_9() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { executeQuery(broker, "for $s in //SCENE/*[fn:contains(LINE, 'the')] return fn:node-name($s)", 1313, null); } } @Test - public void virtualNodeSet_10() throws XPathException, SAXException, PermissionDeniedException, EXistException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + public void virtualNodeSet_10() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { executeQuery(broker, "//SPEECH[fn:contains(LINE, 'perturbed spirit')]/preceding-sibling::*", 65, null); } } @Test - public void virtualNodeSet_11() throws XPathException, SAXException, PermissionDeniedException, EXistException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + public void virtualNodeSet_11() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { executeQuery(broker, "//SPEECH[fn:contains(LINE, 'perturbed spirit')]/following-sibling::*", 1, null); } } - private static Sequence executeQuery(final DBBroker broker, final String query, final int expected, final String expectedResult) throws XPathException, SAXException, PermissionDeniedException { - final XQuery xquery = broker.getBrokerPool().getXQueryService(); - final Sequence seq = xquery.execute(broker, query, null); + private static Sequence executeQuery(final DBBroker broker, final String query, final int expected, final String expectedResult) throws XPathException, SAXException, PermissionDeniedException, IOException { + final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(expected, seq.getItemCount()); if (expectedResult != null) { diff --git a/exist-core/src/test/java/org/exist/numbering/DLNStorageTest.java b/exist-core/src/test/java/org/exist/numbering/DLNStorageTest.java index 3b7cc02b61..057090d1fd 100644 --- a/exist-core/src/test/java/org/exist/numbering/DLNStorageTest.java +++ b/exist-core/src/test/java/org/exist/numbering/DLNStorageTest.java @@ -51,6 +51,7 @@ import org.exist.dom.persistent.NodeHandle; import org.exist.dom.persistent.NodeProxy; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.StorageAddress; @@ -59,7 +60,7 @@ import org.exist.test.ExistEmbeddedServer; import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.*; import org.w3c.dom.Attr; @@ -87,13 +88,12 @@ public class DLNStorageTest { @Test public void nodeStorage() throws Exception { - BrokerPool pool = BrokerPool.getInstance(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); + final BrokerPool pool = BrokerPool.getInstance(); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + // test element ids - Sequence seq = xquery.execute(broker, "doc('/db/test/test_string.xml')/test/para", - null); + String query = "doc('/db/test/test_string.xml')/test/para"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(3, seq.getItemCount()); NodeProxy comment = (NodeProxy) seq.itemAt(0); assertEquals("1.1", comment.getNodeId().toString()); @@ -102,15 +102,15 @@ public void nodeStorage() throws Exception { comment = (NodeProxy) seq.itemAt(2); assertEquals("1.5", comment.getNodeId().toString()); - seq = xquery.execute(broker, "doc('/db/test/test_string.xml')/test//a", - null); + query = "doc('/db/test/test_string.xml')/test//a"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, seq.getItemCount()); NodeProxy a = (NodeProxy) seq.itemAt(0); assertEquals("1.3.2", a.getNodeId().toString()); // test attribute id - seq = xquery.execute(broker, "doc('/db/test/test_string.xml')/test//a/@href", - null); + query = "doc('/db/test/test_string.xml')/test//a/@href"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, seq.getItemCount()); NodeProxy href = (NodeProxy) seq.itemAt(0); StorageAddress.toString(href); @@ -126,8 +126,8 @@ public void nodeStorage() throws Exception { assertEquals("#", href.getStringValue()); // test text node - seq = xquery.execute(broker, "doc('/db/test/test_string.xml')/test//b/text()", - null); + query = "doc('/db/test/test_string.xml')/test//b/text()"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, seq.getItemCount()); NodeProxy text = (NodeProxy) seq.itemAt(0); assertEquals("1.5.2.1", text.getNodeId().toString()); diff --git a/exist-core/src/test/java/org/exist/security/FnCollectionSecurityTest.java b/exist-core/src/test/java/org/exist/security/FnCollectionSecurityTest.java index 0ff16e7e5f..8a37287e18 100644 --- a/exist-core/src/test/java/org/exist/security/FnCollectionSecurityTest.java +++ b/exist-core/src/test/java/org/exist/security/FnCollectionSecurityTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -27,6 +51,7 @@ import org.exist.security.internal.aider.ACEAider; import org.exist.security.internal.aider.GroupAider; import org.exist.security.internal.aider.UserAider; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.txn.Txn; @@ -35,7 +60,7 @@ import org.exist.util.SyntaxException; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -125,8 +150,7 @@ public void canAccessRoot() throws EXistException, AuthenticationException, Perm try (final DBBroker broker = pool.get(Optional.of(testUser1)); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final XQuery xqueryService = pool.getXQueryService(); - final Sequence result = xqueryService.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; transaction.commit(); } @@ -143,8 +167,7 @@ public void canAccessCollection() throws EXistException, AuthenticationException try (final DBBroker broker = pool.get(Optional.of(testUser1)); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final XQuery xqueryService = pool.getXQueryService(); - final Sequence result = xqueryService.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; transaction.commit(); } @@ -161,8 +184,7 @@ public void cannotAccessRestrictedCollection() throws EXistException, Authentica try (final DBBroker broker = pool.get(Optional.of(testUser1)); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final XQuery xqueryService = pool.getXQueryService(); - final Sequence result = xqueryService.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; fail("Expected PermissionDeniedException via XPathException"); transaction.commit(); @@ -176,7 +198,7 @@ public void cannotAccessRestrictedCollection() throws EXistException, Authentica } @Test(expected=PermissionDeniedException.class) - public void cannotAccessCollectionInCollectionHierarchyWithDeniedExecute() throws EXistException, AuthenticationException, PermissionDeniedException, XPathException { + public void cannotAccessCollectionInCollectionHierarchyWithDeniedExecute() throws EXistException, AuthenticationException, PermissionDeniedException, XPathException, IOException { // as docTestUser1 user final String query = "fn:collection('" + TEST_SUB_COLLECTION_1_1 + "')"; @@ -187,8 +209,7 @@ public void cannotAccessCollectionInCollectionHierarchyWithDeniedExecute() throw try (final DBBroker broker = pool.get(Optional.of(testUser1)); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final XQuery xqueryService = pool.getXQueryService(); - final Sequence result = xqueryService.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; fail("Expected PermissionDeniedException via XPathException"); transaction.commit(); @@ -202,7 +223,7 @@ public void cannotAccessCollectionInCollectionHierarchyWithDeniedExecute() throw } @Test(expected=PermissionDeniedException.class) - public void cannotAccessCollectionInCollectionHierarchyWithDeniedReadAndExecuteAce() throws EXistException, AuthenticationException, PermissionDeniedException, XPathException { + public void cannotAccessCollectionInCollectionHierarchyWithDeniedReadAndExecuteAce() throws EXistException, AuthenticationException, PermissionDeniedException, XPathException, IOException { // as docTestUser1 user final String query = "fn:collection('" + TEST_SUB_COLLECTION_2_2 + "')"; @@ -213,8 +234,7 @@ public void cannotAccessCollectionInCollectionHierarchyWithDeniedReadAndExecuteA try (final DBBroker broker = pool.get(Optional.of(testUser1)); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final XQuery xqueryService = pool.getXQueryService(); - final Sequence result = xqueryService.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; fail("Expected PermissionDeniedException via XPathException"); transaction.commit(); diff --git a/exist-core/src/test/java/org/exist/security/FnDocSecurityTest.java b/exist-core/src/test/java/org/exist/security/FnDocSecurityTest.java index 1095fcedba..201de5489b 100644 --- a/exist-core/src/test/java/org/exist/security/FnDocSecurityTest.java +++ b/exist-core/src/test/java/org/exist/security/FnDocSecurityTest.java @@ -52,6 +52,7 @@ import org.exist.security.internal.aider.ACEAider; import org.exist.security.internal.aider.GroupAider; import org.exist.security.internal.aider.UserAider; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.lock.Lock; @@ -63,7 +64,7 @@ import org.exist.util.serializer.XQuerySerializer; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -159,8 +160,7 @@ public void canAccessDocument() throws EXistException, AuthenticationException, try (final DBBroker broker = pool.get(Optional.of(testUser1)); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final XQuery xqueryService = pool.getXQueryService(); - final Sequence result = xqueryService.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(result); assertEquals(1, result.getItemCount()); @@ -181,8 +181,7 @@ public void cannotAccessRestrictedDocument() throws EXistException, Authenticati try (final DBBroker broker = pool.get(Optional.of(testUser1)); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final XQuery xqueryService = pool.getXQueryService(); - final Sequence result = xqueryService.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; fail("Expected PermissionDeniedException via XPathException"); transaction.commit(); @@ -196,7 +195,7 @@ public void cannotAccessRestrictedDocument() throws EXistException, Authenticati } @Test(expected=PermissionDeniedException.class) - public void cannotAccessDocumentInCollectionHierarchyWithDeniedExecute() throws EXistException, AuthenticationException, PermissionDeniedException, XPathException { + public void cannotAccessDocumentInCollectionHierarchyWithDeniedExecute() throws EXistException, AuthenticationException, PermissionDeniedException, XPathException, IOException { // as docTestUser1 user final String query = "fn:doc('" + TEST_DOC_URI_1 + "')"; @@ -207,8 +206,7 @@ public void cannotAccessDocumentInCollectionHierarchyWithDeniedExecute() throws try (final DBBroker broker = pool.get(Optional.of(testUser1)); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final XQuery xqueryService = pool.getXQueryService(); - final Sequence result = xqueryService.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; fail("Expected PermissionDeniedException via XPathException"); transaction.commit(); @@ -222,7 +220,7 @@ public void cannotAccessDocumentInCollectionHierarchyWithDeniedExecute() throws } @Test(expected=PermissionDeniedException.class) - public void cannotAccessDocumentInCollectionHierarchyWithDeniedReadAndExecuteAce() throws EXistException, AuthenticationException, PermissionDeniedException, XPathException { + public void cannotAccessDocumentInCollectionHierarchyWithDeniedReadAndExecuteAce() throws EXistException, AuthenticationException, PermissionDeniedException, XPathException, IOException { // as docTestUser1 user final String query = "fn:doc('" + TEST_DOC_URI_2 + "')"; @@ -233,8 +231,7 @@ public void cannotAccessDocumentInCollectionHierarchyWithDeniedReadAndExecuteAce try (final DBBroker broker = pool.get(Optional.of(testUser1)); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final XQuery xqueryService = pool.getXQueryService(); - final Sequence result = xqueryService.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; fail("Expected PermissionDeniedException via XPathException"); transaction.commit(); diff --git a/exist-core/src/test/java/org/exist/security/SecurityManagerTest.java b/exist-core/src/test/java/org/exist/security/SecurityManagerTest.java index 968f1cb764..6ab16397af 100644 --- a/exist-core/src/test/java/org/exist/security/SecurityManagerTest.java +++ b/exist-core/src/test/java/org/exist/security/SecurityManagerTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -27,6 +51,7 @@ import org.exist.security.internal.RealmImpl; import org.exist.security.internal.aider.GroupAider; import org.exist.security.internal.aider.UserAider; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.lock.Lock; @@ -34,12 +59,13 @@ import org.exist.util.LockException; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; +import java.io.IOException; import java.util.Optional; import static org.junit.Assert.*; @@ -83,7 +109,7 @@ public static void setup() throws EXistException, PermissionDeniedException { } @Test - public void deleteAccount() throws EXistException, PermissionDeniedException, XPathException, LockException { + public void deleteAccount() throws EXistException, PermissionDeniedException, XPathException, LockException, IOException { final BrokerPool brokerPool = existEmbeddedServer.getBrokerPool(); final SecurityManager securityManager = brokerPool.getSecurityManager(); @@ -172,15 +198,15 @@ public void deleteAccount() throws EXistException, PermissionDeniedException, XP } } - private boolean removedAccountExists(final DBBroker broker, final String username) throws XPathException, PermissionDeniedException { - final XQuery queryService = broker.getBrokerPool().getXQueryService(); - final Sequence result = queryService.execute(broker, "declare namespace config='http://exist-db.org/Configuration'; collection('" + REMOVED_ACCOUNTS_URI + "')//config:account[config:name eq '" + username + "']", null); + private boolean removedAccountExists(final DBBroker broker, final String username) throws XPathException, PermissionDeniedException, IOException { + final String query = "declare namespace config='http://exist-db.org/Configuration'; collection('" + REMOVED_ACCOUNTS_URI + "')//config:account[config:name eq '" + username + "']"; + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; return result.getItemCount() == 1 && result.itemAt(0).toJavaObject(Boolean.class) == true; } - private boolean removedGroupExists(final DBBroker broker, final String groupName) throws XPathException, PermissionDeniedException { - final XQuery queryService = broker.getBrokerPool().getXQueryService(); - final Sequence result = queryService.execute(broker, "declare namespace config='http://exist-db.org/Configuration'; collection('" + REMOVED_GROUPS_URI + "')//config:group[config:name eq '" + groupName + "']", null); + private boolean removedGroupExists(final DBBroker broker, final String groupName) throws XPathException, PermissionDeniedException, IOException { + final String query = "declare namespace config='http://exist-db.org/Configuration'; collection('" + REMOVED_GROUPS_URI + "')//config:group[config:name eq '" + groupName + "']"; + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; return result.getItemCount() == 1 && result.itemAt(0).toJavaObject(Boolean.class) == true; } } diff --git a/exist-core/src/test/java/org/exist/security/XqueryApiTest.java b/exist-core/src/test/java/org/exist/security/XqueryApiTest.java index 1b0873cbc8..c502362975 100644 --- a/exist-core/src/test/java/org/exist/security/XqueryApiTest.java +++ b/exist-core/src/test/java/org/exist/security/XqueryApiTest.java @@ -48,16 +48,18 @@ import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.output.StringBuilderWriter; import org.exist.EXistException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.test.ExistEmbeddedServer; import org.exist.util.serializer.XQuerySerializer; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.ClassRule; import org.xml.sax.SAXException; +import java.io.IOException; import java.util.Optional; import java.util.Properties; @@ -150,13 +152,12 @@ protected void createBinResource(final String resourceUri, final byte[] content, private Sequence executeQuery(final String uid, final String pwd, final String query) throws ApiException { try { final BrokerPool pool = server.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); final Subject user = pool.getSecurityManager().authenticate(uid, pwd); try (final DBBroker broker = pool.get(Optional.of(user))) { - return xquery.execute(broker, query, null); + return XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; } - } catch (final AuthenticationException | EXistException | PermissionDeniedException | XPathException e) { + } catch (final AuthenticationException | EXistException | IOException | PermissionDeniedException | XPathException e) { throw new ApiException(e.getMessage(), e); } } diff --git a/exist-core/src/test/java/org/exist/storage/AbstractUpdateTest.java b/exist-core/src/test/java/org/exist/storage/AbstractUpdateTest.java index 203d9155a1..c51bb3522f 100644 --- a/exist-core/src/test/java/org/exist/storage/AbstractUpdateTest.java +++ b/exist-core/src/test/java/org/exist/storage/AbstractUpdateTest.java @@ -52,6 +52,7 @@ import org.exist.dom.persistent.LockedDocument; import org.exist.dom.persistent.MutableDocumentSet; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.lock.Lock.LockMode; import org.exist.storage.serializers.Serializer; import org.exist.storage.txn.TransactionManager; @@ -62,7 +63,7 @@ import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Item; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceIterator; @@ -116,7 +117,7 @@ public final void update() throws EXistException, DatabaseConfigurationException protected abstract void doUpdate(final DBBroker broker, final TransactionManager transact, final MutableDocumentSet docs) throws ParserConfigurationException, IOException, SAXException, LockException, XPathException, PermissionDeniedException, EXistException; - private void read(final BrokerPool pool) throws EXistException, PermissionDeniedException, SAXException, XPathException { + private void read(final BrokerPool pool) throws EXistException, PermissionDeniedException, SAXException, XPathException, IOException { try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { final Serializer serializer = broker.borrowSerializer(); @@ -127,9 +128,9 @@ private void read(final BrokerPool pool) throws EXistException, PermissionDenied } finally { broker.returnSerializer(serializer); } - - final XQuery xquery = pool.getXQueryService(); - final Sequence seq = xquery.execute(broker, "/products/product[last()]", null); + + final String query = "/products/product[last()]"; + final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; for (final SequenceIterator i = seq.iterate(); i.hasNext(); ) { Item next = i.nextItem(); } diff --git a/exist-core/src/test/java/org/exist/storage/RangeIndexUpdateTest.java b/exist-core/src/test/java/org/exist/storage/RangeIndexUpdateTest.java index c5dcdb674c..4cf671ac2c 100644 --- a/exist-core/src/test/java/org/exist/storage/RangeIndexUpdateTest.java +++ b/exist-core/src/test/java/org/exist/storage/RangeIndexUpdateTest.java @@ -54,6 +54,7 @@ import org.exist.dom.persistent.MutableDocumentSet; import org.exist.dom.QName; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.txn.TransactionManager; import org.exist.storage.txn.Txn; import org.exist.test.ExistEmbeddedServer; @@ -61,7 +62,7 @@ import org.exist.util.*; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.StringValue; import org.exist.xupdate.Modification; @@ -124,9 +125,8 @@ public void updates() throws EXistException, PermissionDeniedException, XPathExc checkIndex(broker, docs, ITEM_QNAME, new StringValue("Table892.25"), 1); checkIndex(broker, docs, ITEM_QNAME, new StringValue("Cabinet1525.00"), 1); - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - final Sequence seq = xquery.execute(broker, "//item[. = 'Chair']", null); + final String query = "//item[. = 'Chair']"; + final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); diff --git a/exist-core/src/test/java/org/exist/storage/RecoveryTest.java b/exist-core/src/test/java/org/exist/storage/RecoveryTest.java index 0571a96a6f..2871f0558a 100644 --- a/exist-core/src/test/java/org/exist/storage/RecoveryTest.java +++ b/exist-core/src/test/java/org/exist/storage/RecoveryTest.java @@ -55,6 +55,7 @@ import org.exist.dom.persistent.BinaryDocument; import org.exist.dom.persistent.LockedDocument; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.btree.BTreeException; import org.exist.storage.dom.DOMFile; import org.exist.storage.lock.Lock.LockMode; @@ -67,7 +68,7 @@ import org.exist.util.io.InputStreamUtil; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Item; import org.exist.xquery.value.NodeValue; import org.exist.xquery.value.Sequence; @@ -208,9 +209,8 @@ private void verify(final BrokerPool pool) throws EXistException, PermissionDeni assertNull("Document '" + XmldbURI.ROOT_COLLECTION + "/test/test2/'" + lastSampleName + " should not exist anymore", lockedDoc); } - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - final Sequence seq = xquery.execute(broker, "//SPEECH[contains(LINE, 'king')]", null); + final String query = "//SPEECH[contains(LINE, 'king')]"; + final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); for (final SequenceIterator i = seq.iterate(); i.hasNext(); ) { final Item next = i.nextItem(); diff --git a/exist-core/src/test/java/org/exist/storage/ShutdownTest.java b/exist-core/src/test/java/org/exist/storage/ShutdownTest.java index 0c63df04b1..738b2b4937 100644 --- a/exist-core/src/test/java/org/exist/storage/ShutdownTest.java +++ b/exist-core/src/test/java/org/exist/storage/ShutdownTest.java @@ -51,6 +51,7 @@ import org.exist.EXistException; import org.exist.collections.Collection; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.txn.TransactionManager; import org.exist.storage.txn.Txn; import org.exist.test.ExistEmbeddedServer; @@ -58,7 +59,7 @@ import org.exist.util.*; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.ClassRule; import org.junit.Test; @@ -102,9 +103,8 @@ public void storeAndShutdown() throws EXistException, PermissionDeniedException, broker.storeDocument(transaction, XmldbURI.create(sampleName), new InputStreamSupplierInputSource(() -> SAMPLES.getShakespeareSample(sampleName)), xmlMediaType, test); } - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - final Sequence result = xquery.execute(broker, "//SPEECH[contains(LINE, 'love')]", null); + final String query = "//SPEECH[contains(LINE, 'love')]"; + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(result); assertEquals(187, result.getItemCount()); diff --git a/exist-core/src/test/java/org/exist/storage/XIncludeSerializerTest.java b/exist-core/src/test/java/org/exist/storage/XIncludeSerializerTest.java index 64fa99f7dc..9e51780526 100644 --- a/exist-core/src/test/java/org/exist/storage/XIncludeSerializerTest.java +++ b/exist-core/src/test/java/org/exist/storage/XIncludeSerializerTest.java @@ -45,24 +45,29 @@ */ package org.exist.storage; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.fluent.Executor; +import org.apache.http.client.fluent.Request; import org.apache.xmlrpc.XmlRpcException; import org.apache.xmlrpc.client.XmlRpcClient; import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; import org.exist.Namespaces; import org.exist.test.ExistWebServer; +import org.exist.util.io.InputStreamUtil; import org.exist.xmldb.XmldbURI; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.hamcrest.MatcherAssert.assertThat; -import org.xml.sax.SAXException; +import static org.junit.Assert.assertEquals; + import org.xmlunit.matchers.CompareMatcher; -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; +import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; @@ -170,141 +175,102 @@ private final static String getRestUri() { + ""; @Test - public void absSimpleREST() throws IOException, SAXException { + public void absSimpleREST() throws IOException { // path needs to indicate indent and wrap is off final String uri = getRestUri() + "/test_simple.xml?_indent=no&_wrap=no"; - // we use honest http - final HttpURLConnection connect = getConnection(uri); - connect.setRequestMethod("GET"); - connect.connect(); - - final StringBuilder out = new StringBuilder(); - try(final BufferedReader reader = new BufferedReader(new InputStreamReader(connect.getInputStream(), "UTF-8"))) { - String line; - while ((line = reader.readLine()) != null) { - out.append(line); - out.append("\r\n"); - } - } + final HttpResponse response = Executor.newInstance() + .execute(Request.Get(uri)) + .returnResponse(); + + final String responseBody = responseBodyToString(response); - final String responseXML = out.toString(); - assertThat(responseXML, CompareMatcher.isIdenticalTo(XML_RESULT)); + assertEquals(response.getStatusLine().toString() + ": " + responseBody, HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); + assertThat(responseBody, CompareMatcher.isIdenticalTo(XML_RESULT)); } @Test - public void relSimpleREST1() throws IOException, SAXException { + public void relSimpleREST1() throws IOException { final String uri = getRestUri() + "/test_relative1.xml?_indent=no&_wrap=no"; - final HttpURLConnection connect = getConnection(uri); - connect.setRequestMethod("GET"); - connect.connect(); + final HttpResponse response = Executor.newInstance() + .execute(Request.Get(uri)) + .returnResponse(); - final BufferedReader reader = new BufferedReader(new InputStreamReader(connect.getInputStream(), "UTF-8")); - String line; - final StringBuilder out = new StringBuilder(); - while ((line = reader.readLine()) != null) { - out.append(line); - out.append("\r\n"); - } - final String responseXML = out.toString(); - assertThat(responseXML, CompareMatcher.isIdenticalTo(XML_RESULT)); + final String responseBody = responseBodyToString(response); + + assertEquals(response.getStatusLine().toString() + ": " + responseBody, HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); + assertThat(responseBody, CompareMatcher.isIdenticalTo(XML_RESULT)); } @Test - public void relSimpleREST2() throws IOException, SAXException { + public void relSimpleREST2() throws IOException { // path needs to indicate indent and wrap is off final String uri = getRestUri() + "/test_relative2.xml?_indent=no&_wrap=no"; - final HttpURLConnection connect = getConnection(uri); - connect.setRequestMethod("GET"); - connect.connect(); + final HttpResponse response = Executor.newInstance() + .execute(Request.Get(uri)) + .returnResponse(); - final BufferedReader reader = new BufferedReader(new InputStreamReader(connect.getInputStream(), "UTF-8")); - String line; - final StringBuilder out = new StringBuilder(); - while ((line = reader.readLine()) != null) { - out.append(line); - out.append("\r\n"); - } - final String responseXML = out.toString(); - assertThat(responseXML, CompareMatcher.isIdenticalTo(XML_RESULT)); + final String responseBody = responseBodyToString(response); + + assertEquals(response.getStatusLine().toString() + ": " + responseBody, HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); + assertThat(responseBody, CompareMatcher.isIdenticalTo(XML_RESULT)); } @Test - public void xpointerREST3() throws IOException, SAXException { + public void xpointerREST3() throws IOException { final String uri = getRestUri() + "/test_xpointer1.xml?_indent=no&_wrap=no"; - final HttpURLConnection connect = getConnection(uri); - connect.setRequestMethod("GET"); - connect.connect(); + final HttpResponse response = Executor.newInstance() + .execute(Request.Get(uri)) + .returnResponse(); - final BufferedReader reader = new BufferedReader(new InputStreamReader(connect.getInputStream(), "UTF-8")); - String line; - StringBuilder out = new StringBuilder(); - while ((line = reader.readLine()) != null) { - out.append(line); - out.append("\r\n"); - } - final String responseXML = out.toString(); - assertThat(responseXML, CompareMatcher.isIdenticalTo(XML_RESULT_XPOINTER)); + final String responseBody = responseBodyToString(response); + + assertEquals(response.getStatusLine().toString() + ": " + responseBody, HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); + assertThat(responseBody, CompareMatcher.isIdenticalTo(XML_RESULT_XPOINTER)); } @Test - public void xpointerREST4() throws IOException, SAXException { + public void xpointerREST4() throws IOException { final String uri = getRestUri() + "/test_xpointer2.xml?_indent=no&_wrap=no"; - final HttpURLConnection connect = getConnection(uri); - connect.setRequestMethod("GET"); - connect.connect(); + final HttpResponse response = Executor.newInstance() + .execute(Request.Get(uri)) + .returnResponse(); - final BufferedReader reader = new BufferedReader(new InputStreamReader(connect.getInputStream(), "UTF-8")); - String line; - final StringBuilder out = new StringBuilder(); - while ((line = reader.readLine()) != null) { - out.append(line); - out.append("\r\n"); - } - final String responseXML = out.toString(); - assertThat(responseXML, CompareMatcher.isIdenticalTo(XML_RESULT_XPOINTER)); + final String responseBody = responseBodyToString(response); + + assertEquals(response.getStatusLine().toString() + ": " + responseBody, HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); + assertThat(responseBody, CompareMatcher.isIdenticalTo(XML_RESULT_XPOINTER)); } @Test - public void fallback1() throws IOException, SAXException { + public void fallback1() throws IOException { final String uri = getRestUri() + "/test_fallback1.xml?_indent=no&_wrap=no"; - final HttpURLConnection connect = getConnection(uri); - connect.setRequestMethod("GET"); - connect.connect(); + final HttpResponse response = Executor.newInstance() + .execute(Request.Get(uri)) + .returnResponse(); - final BufferedReader reader = new BufferedReader(new InputStreamReader(connect.getInputStream(), "UTF-8")); - String line; - final StringBuilder out = new StringBuilder(); - while ((line = reader.readLine()) != null) { - out.append(line); - out.append("\r\n"); - } - final String responseXML = out.toString(); - assertThat(responseXML, CompareMatcher.isIdenticalTo(XML_RESULT_FALLBACK1)); + final String responseBody = responseBodyToString(response); + + assertEquals(response.getStatusLine().toString() + ": " + responseBody, HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); + assertThat(responseBody, CompareMatcher.isIdenticalTo(XML_RESULT_FALLBACK1)); } - @Test(expected = IOException.class) + @Test public void fallback2() throws IOException { final String uri = getRestUri() + "/test_fallback2.xml?_indent=no&_wrap=no"; - final HttpURLConnection connect = getConnection(uri); - connect.setRequestMethod("GET"); - connect.connect(); - - final StringBuilder out = new StringBuilder(); - try (final BufferedReader reader = new BufferedReader(new InputStreamReader(connect.getInputStream(), "UTF-8"))) { - String line; - while ((line = reader.readLine()) != null) { - out.append(line); - out.append("\r\n"); - } - } - final String responseXML = out.toString(); + final HttpResponse response = Executor.newInstance() + .execute(Request.Get(uri)) + .returnResponse(); + + final String responseBody = responseBodyToString(response); + + assertEquals(response.getStatusLine().toString() + ": " + responseBody, HttpStatus.SC_BAD_REQUEST, response.getStatusLine().getStatusCode()); } //TODO add full url test e.g. http://www.example.org/test.xml for xinclude @@ -331,14 +297,6 @@ public void fallback2() throws IOException { // probably overkill //TODO check serialisation via this interface, simple and relative??? // probably overkill - /* - * helper functions - * - */ - protected HttpURLConnection getConnection(final String url) throws IOException { - final URL u = new URL(url); - return (HttpURLConnection) u.openConnection(); - } private static XmlRpcClient getClient() throws MalformedURLException { final XmlRpcClient client = new XmlRpcClient(); @@ -421,4 +379,10 @@ public static void startDB() throws XmlRpcException, MalformedURLException { params.add(1); xmlrpc.execute("parse", params); } + + private static String responseBodyToString(final HttpResponse response) throws IOException { + try (final InputStream is = response.getEntity().getContent()) { + return InputStreamUtil.readString(is, UTF_8); + } + } } diff --git a/exist-core/src/test/java/org/exist/test/Util.java b/exist-core/src/test/java/org/exist/test/Util.java index c451f6a5d7..393145a249 100644 --- a/exist-core/src/test/java/org/exist/test/Util.java +++ b/exist-core/src/test/java/org/exist/test/Util.java @@ -32,29 +32,18 @@ */ package org.exist.test; -import com.evolvedbinary.j8fu.function.Function2E; import org.exist.EXistException; import org.exist.collections.Collection; import org.exist.security.PermissionDeniedException; -import org.exist.source.Source; -import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; import org.exist.storage.txn.Txn; import org.exist.util.LockException; import org.exist.xmldb.XmldbURI; -import org.exist.xquery.CompiledXQuery; -import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; -import org.exist.xquery.XQueryContext; -import org.exist.xquery.value.Sequence; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import xyz.elemental.mediatype.MediaType; -import javax.annotation.Nullable; import java.io.IOException; -import java.util.Properties; /** * Tests utility methods. @@ -69,59 +58,4 @@ public static XmldbURI storeQuery(final DBBroker broker, final Txn transaction, broker.storeDocument(transaction, name, querySource, xqueryMediaType, collection); return collection.getURI().append(name); } - - public static Sequence executeQuery(final DBBroker broker, final CompiledXQuery compiledXQuery) throws PermissionDeniedException, XPathException { - final BrokerPool pool = broker.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - return xqueryService.execute(broker, compiledXQuery, null, new Properties()); - } - - public static T withCompiledQuery(final DBBroker broker, final Source source, final Function2E op) throws XPathException, PermissionDeniedException, IOException { - final BrokerPool pool = broker.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - final XQueryPool xqueryPool = pool.getXQueryPool(); - final CompiledXQuery compiledQuery = compileQuery(broker, xqueryService, xqueryPool, source); - try { - return op.apply(compiledQuery); - } finally { - if (compiledQuery != null) { - if (compiledQuery.getContext() != null) { - compiledQuery.getContext().runCleanupTasks(); - } - xqueryPool.returnCompiledXQuery(source, compiledQuery); - } - } - } - - public static CompiledXQuery compileQuery(final DBBroker broker, final XQuery xqueryService, final XQueryPool xqueryPool, final Source query) throws PermissionDeniedException, XPathException, IOException { - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - compiled = xqueryPool.borrowCompiledXQuery(broker, query); - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - if (compiled == null) { - compiled = xqueryService.compile(context, query); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } - - return compiled; - - } catch (final PermissionDeniedException | XPathException | IOException e) { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - xqueryPool.returnCompiledXQuery(query, compiled); - } - throw e; - } - } } diff --git a/exist-core/src/test/java/org/exist/validation/TestTools.java b/exist-core/src/test/java/org/exist/validation/TestTools.java index 147b9a23d5..c1aa870da8 100644 --- a/exist-core/src/test/java/org/exist/validation/TestTools.java +++ b/exist-core/src/test/java/org/exist/validation/TestTools.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -19,17 +43,9 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - package org.exist.validation; -import org.exist.EXistException; -import org.exist.security.PermissionDeniedException; -import org.exist.storage.BrokerPool; -import org.exist.storage.DBBroker; import org.exist.util.io.InputStreamUtil; -import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; -import org.exist.xquery.value.Sequence; import java.io.IOException; import java.io.InputStream; @@ -62,11 +78,4 @@ public static void insertDocumentToURL(final InputStream document, final String InputStreamUtil.copy(document, os); } } - - public static Sequence executeQuery(final BrokerPool pool, final String query) throws EXistException, PermissionDeniedException, XPathException { - final XQuery xquery = pool.getXQueryService(); - try(final DBBroker broker = pool.getBroker()) { - return xquery.execute(broker, query, null); - } - } } diff --git a/exist-core/src/test/java/org/exist/xquery/CleanupTest.java b/exist-core/src/test/java/org/exist/xquery/CleanupTest.java index 18a97ce17f..21bdc3cf8e 100644 --- a/exist-core/src/test/java/org/exist/xquery/CleanupTest.java +++ b/exist-core/src/test/java/org/exist/xquery/CleanupTest.java @@ -49,6 +49,7 @@ import org.exist.dom.QName; import org.exist.dom.persistent.DocumentSet; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.test.ExistXmldbEmbeddedServer; @@ -62,6 +63,7 @@ import org.xmldb.api.modules.CollectionManagementService; import xyz.elemental.mediatype.MediaType; +import java.io.IOException; import java.util.Iterator; import java.util.List; import java.util.Optional; @@ -162,12 +164,11 @@ public void resetStateOfModuleVars() throws XMLDBException, XPathException { } @Test - public void resetStateOfInlineFunc() throws XMLDBException, EXistException, PermissionDeniedException, XPathException { + public void resetStateOfInlineFunc() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = BrokerPool.getInstance(); - final XQuery xquery = pool.getXQueryService(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { // execute query to get a function item - final Sequence result = xquery.execute(broker, TEST_INLINE, Sequence.EMPTY_SEQUENCE); + final Sequence result = XQueryUtil.query(broker, new StringSource(TEST_INLINE), false, Sequence.EMPTY_SEQUENCE, null, null, null, null).result; assertEquals(result.getItemCount(), 1); final FunctionCall call = ((FunctionReference)result.itemAt(0)).getCall(); // closure variables are set when function item is created, but should be cleared after query diff --git a/exist-core/src/test/java/org/exist/xquery/ConstructedNodesRecoveryTest.java b/exist-core/src/test/java/org/exist/xquery/ConstructedNodesRecoveryTest.java index e713f48901..237a77551c 100644 --- a/exist-core/src/test/java/org/exist/xquery/ConstructedNodesRecoveryTest.java +++ b/exist-core/src/test/java/org/exist/xquery/ConstructedNodesRecoveryTest.java @@ -52,6 +52,7 @@ import org.exist.dom.persistent.DocumentImpl; import org.exist.dom.persistent.LockedDocument; import org.exist.security.PermissionDeniedException; +import org.exist.source.Source; import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; @@ -66,10 +67,10 @@ import org.exist.util.LockException; import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; -import org.exist.xquery.value.Sequence; import org.exist.util.serializer.SAXSerializer; import org.exist.util.serializer.SerializerPool; +import org.exist.xquery.value.Sequence; import org.junit.After; import org.junit.Test; @@ -90,7 +91,7 @@ */ public class ConstructedNodesRecoveryTest { - private final static String xquery = + private final static String query = "declare variable $categories := \n" + " \n" + " Fruit\n" + @@ -259,19 +260,13 @@ private void constructedNodeQuery(boolean forceCorruption) throws EXistException createTempChildCollection(broker, transact, "testchild2"); //execute an xquery - XQuery service = pool.getXQueryService(); - assertNotNull(service); - - CompiledXQuery compiled = service.compile(new XQueryContext(pool), new StringSource(xquery)); - assertNotNull(compiled); - - Sequence result = service.execute(broker, compiled, null); - assertNotNull(result); - + final Source source = new StringSource(query); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); + + final Sequence result = queryResult.result; assertEquals(expectedResults.length, result.getItemCount()); - for(int i = 0; i < result.getItemCount(); i++) - { + for (int i = 0; i < result.getItemCount(); i++) { assertEquals(expectedResults[i], (String)result.itemAt(i).getStringValue()); } diff --git a/exist-core/src/test/java/org/exist/xquery/ForwardReferenceTest.java b/exist-core/src/test/java/org/exist/xquery/ForwardReferenceTest.java index 3f7606f5cc..f2118d9cf8 100644 --- a/exist-core/src/test/java/org/exist/xquery/ForwardReferenceTest.java +++ b/exist-core/src/test/java/org/exist/xquery/ForwardReferenceTest.java @@ -59,7 +59,6 @@ import org.exist.util.StringInputSource; import org.exist.util.serializer.XQuerySerializer; import org.exist.xmldb.XmldbURI; -import org.exist.xquery.value.Sequence; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; @@ -174,18 +173,15 @@ public void test1() throws EXistException, PermissionDeniedException, IOExceptio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final String xqSuiteXmlResult = withCompiledQuery(broker, testXquerySource, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - try (final StringBuilderWriter writer = new StringBuilderWriter()) { - final XQuerySerializer xquerySerializer = new XQuerySerializer(broker, new Properties(), writer); - xquerySerializer.serialize(result); - return writer.toString(); - } catch (final SAXException e) { - throw new XPathException((Expression) null, e); - } - }); - - assertNotNull(xqSuiteXmlResult); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, testXquerySource, false, null, null, null, null, null); + + try (final StringBuilderWriter writer = new StringBuilderWriter()) { + final XQuerySerializer xquerySerializer = new XQuerySerializer(broker, new Properties(), writer); + xquerySerializer.serialize(queryResult.result); + assertNotNull(writer.toString()); + } catch (final SAXException e) { + throw new XPathException((Expression) null, e); + } transaction.commit(); } diff --git a/exist-core/src/test/java/org/exist/xquery/ImportModuleTest.java b/exist-core/src/test/java/org/exist/xquery/ImportModuleTest.java index 5a4724fba0..b6c2cb851a 100644 --- a/exist-core/src/test/java/org/exist/xquery/ImportModuleTest.java +++ b/exist-core/src/test/java/org/exist/xquery/ImportModuleTest.java @@ -32,7 +32,6 @@ */ package org.exist.xquery; -import com.evolvedbinary.j8fu.function.Function2E; import com.evolvedbinary.j8fu.tuple.Tuple2; import org.exist.EXistException; import org.exist.collections.Collection; @@ -42,14 +41,12 @@ import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; import org.exist.storage.lock.Lock; import org.exist.storage.txn.Txn; import org.exist.test.ExistEmbeddedServer; import org.exist.util.LockException; import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; -import org.exist.xquery.value.Sequence; import org.junit.Rule; import org.junit.Test; import org.w3c.dom.Element; @@ -62,7 +59,6 @@ import javax.annotation.Nullable; import java.io.IOException; import java.util.Optional; -import java.util.Properties; import static java.nio.charset.StandardCharsets.UTF_8; import static com.evolvedbinary.j8fu.tuple.Tuple.Tuple; @@ -125,10 +121,7 @@ public void prefixXmlNs() throws SAXException, PermissionDeniedException, IOExce // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -183,10 +176,7 @@ public void prefixSameAsOtherImport() throws EXistException, IOException, SAXExc // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -230,10 +220,7 @@ public void prefixSameAsOtherNamespaceDeclaration() throws EXistException, IOExc // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -288,10 +275,7 @@ public void prefixSameAsModuleDeclaration() throws EXistException, IOException, // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -333,10 +317,7 @@ public void emptyNamespace() throws EXistException, IOException, PermissionDenie // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -393,10 +374,7 @@ public void namespaceSameAsOtherImport() throws EXistException, IOException, Per // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -428,10 +406,7 @@ public void noSuchModuleWithLocationHint() throws EXistException, IOException, P // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -463,10 +438,7 @@ public void noSuchModuleWithoutLocationHint() throws EXistException, IOException // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -520,10 +492,7 @@ public void functionSameAsOtherModule() throws EXistException, IOException, Perm // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -564,10 +533,7 @@ public void functionDuplicateInMainModule() throws EXistException, IOException, // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -611,10 +577,7 @@ public void functionDuplicateNsInMainModule() throws EXistException, IOException // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -663,10 +626,7 @@ public void functionSameAsImportingModule() throws EXistException, IOException, // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -716,10 +676,7 @@ public void variableSameAsOtherModule() throws EXistException, IOException, Perm // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -763,10 +720,7 @@ public void variableSameAsImportingModule() throws EXistException, IOException, // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -809,15 +763,12 @@ public void functionsSingleLocationHint() throws EXistException, IOException, Pe ); // execute query - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); // check that the result was correct - assertNotNull(contextAndResult._2); - assertEquals(1, contextAndResult._2.getItemCount()); - final Element doc = (Element)contextAndResult._2.itemAt(0); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); assertNotNull(doc); final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); @@ -883,15 +834,12 @@ public void functionsCompositeFromMultipleLocationHints() throws EXistException, ); // execute query - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); // check that the result was correct - assertNotNull(contextAndResult._2); - assertEquals(1, contextAndResult._2.getItemCount()); - final Element doc = (Element)contextAndResult._2.itemAt(0); + assertNotNull(queryResult); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element)queryResult.result.itemAt(0); assertNotNull(doc); final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); @@ -963,15 +911,12 @@ public void functionsCompositeFromMultipleLocationHintsWithDifferingPrefixes() t ); // execute query - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); // check that the result was correct - assertNotNull(contextAndResult._2); - assertEquals(1, contextAndResult._2.getItemCount()); - final Element doc = (Element)contextAndResult._2.itemAt(0); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element)queryResult.result.itemAt(0); assertNotNull(doc); final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); @@ -1022,15 +967,12 @@ public void variablesSingleLocationHint() throws EXistException, IOException, Pe ); // execute query - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); // check that the result was correct - assertNotNull(contextAndResult._2); - assertEquals(1, contextAndResult._2.getItemCount()); - final Element doc = (Element)contextAndResult._2.itemAt(0); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); assertNotNull(doc); final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); @@ -1090,15 +1032,12 @@ public void variablesCompositeFromMultipleLocationHints() throws EXistException, ); // execute query - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); // check that the result was correct - assertNotNull(contextAndResult._2); - assertEquals(1, contextAndResult._2.getItemCount()); - final Element doc = (Element)contextAndResult._2.itemAt(0); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); assertNotNull(doc); final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); @@ -1164,15 +1103,12 @@ public void variablesCompositeFromMultipleLocationHintsWithDifferingPrefixes() t ); // execute query - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); // check that the result was correct - assertNotNull(contextAndResult._2); - assertEquals(1, contextAndResult._2.getItemCount()); - final Element doc = (Element)contextAndResult._2.itemAt(0); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); assertNotNull(doc); final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); @@ -1240,15 +1176,12 @@ public void variablesBetweenModules() throws EXistException, PermissionDeniedExc ); // execute query - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); // check that the result was correct - assertNotNull(contextAndResult._2); - assertEquals(1, contextAndResult._2.getItemCount()); - final Element doc = (Element) contextAndResult._2.itemAt(0); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); assertNotNull(doc); final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); @@ -1323,10 +1256,7 @@ public void xq10CyclicTwoLibraryModules() throws EXistException, IOException, Pe // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -1386,15 +1316,12 @@ public void xq31CyclicTwoLibraryModules() throws EXistException, IOException, Pe ); // execute query - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); // check that the result was correct - assertNotNull(contextAndResult._2); - assertEquals(1, contextAndResult._2.getItemCount()); - final Element doc = (Element) contextAndResult._2.itemAt(0); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); assertNotNull(doc); final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); @@ -1473,10 +1400,7 @@ public void xq10CyclicThreeLibraryModules() throws EXistException, IOException, // execute query try { - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); @@ -1546,15 +1470,12 @@ public void xq31CyclicThreeLibraryModules() throws EXistException, IOException, ); // execute query - final Tuple2 contextAndResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return Tuple(compiledXQuery.getContext(), result); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); // check that the result was correct - assertNotNull(contextAndResult._2); - assertEquals(1, contextAndResult._2.getItemCount()); - final Element doc = (Element) contextAndResult._2.itemAt(0); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); assertNotNull(doc); final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); @@ -1588,59 +1509,4 @@ private void storeModules(final DBBroker broker, final Txn transaction, final St } } } - - private Sequence executeQuery(final DBBroker broker, final CompiledXQuery compiledXQuery) throws PermissionDeniedException, XPathException { - final BrokerPool pool = broker.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - return xqueryService.execute(broker, compiledXQuery, null, new Properties()); - } - - private T withCompiledQuery(final DBBroker broker, final Source source, final Function2E op) throws XPathException, PermissionDeniedException, IOException { - final BrokerPool pool = broker.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - final XQueryPool xqueryPool = pool.getXQueryPool(); - final CompiledXQuery compiledQuery = compileQuery(broker, xqueryService, xqueryPool, source); - try { - return op.apply(compiledQuery); - } finally { - if (compiledQuery != null) { - if (compiledQuery.getContext() != null) { - compiledQuery.getContext().runCleanupTasks(); - } - xqueryPool.returnCompiledXQuery(source, compiledQuery); - } - } - } - - private CompiledXQuery compileQuery(final DBBroker broker, final XQuery xqueryService, final XQueryPool xqueryPool, final Source query) throws PermissionDeniedException, XPathException, IOException { - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - compiled = xqueryPool.borrowCompiledXQuery(broker, query); - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - if (compiled == null) { - compiled = xqueryService.compile(context, query); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } - - return compiled; - - } catch (final PermissionDeniedException | XPathException | IOException e) { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - xqueryPool.returnCompiledXQuery(query, compiled); - } - throw e; - } - } } diff --git a/exist-core/src/test/java/org/exist/xquery/JavaBindingTest.java b/exist-core/src/test/java/org/exist/xquery/JavaBindingTest.java index 3ce6268499..d0adc8c789 100644 --- a/exist-core/src/test/java/org/exist/xquery/JavaBindingTest.java +++ b/exist-core/src/test/java/org/exist/xquery/JavaBindingTest.java @@ -28,10 +28,10 @@ import org.exist.storage.txn.Txn; import org.exist.test.ExistEmbeddedServer; import org.exist.xquery.value.Item; -import org.exist.xquery.value.Sequence; import org.exist.xquery.value.Type; import org.junit.ClassRule; import org.junit.Test; +import org.junit.jupiter.api.Assertions; import java.io.IOException; import java.math.BigInteger; @@ -44,12 +44,12 @@ import java.util.Optional; import static com.evolvedbinary.j8fu.tuple.Tuple.Tuple; -import static org.exist.test.Util.executeQuery; -import static org.exist.test.Util.withCompiledQuery; import static org.exist.util.MapUtil.hashMap; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import static org.junit.jupiter.api.Assertions.*; /** * @author Adam Retter @@ -83,14 +83,12 @@ public void callStaticMethod() throws EXistException, XPathException, Permission try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.DOUBLE, queryResult.getType()); - assertEquals(-0.058374143427580086, queryResult.toJavaObject(double.class), 0); + assertEquals(Type.DOUBLE, item.getType()); + assertEquals(-0.058374143427580086, item.toJavaObject(double.class), 0); transaction.commit(); } @@ -108,14 +106,12 @@ public void functionAvailableStaticMethod() throws EXistException, XPathExceptio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, queryResult.getType()); - assertTrue(queryResult.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); transaction.commit(); } @@ -133,14 +129,12 @@ public void functionAvailableStaticMethodVarArgs0() throws EXistException, XPath try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, queryResult.getType()); - assertFalse(queryResult.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertFalse(item.toJavaObject(boolean.class)); transaction.commit(); } @@ -157,14 +151,12 @@ public void callStaticMethodVarArgs1() throws EXistException, XPathException, Pe try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, queryResult.getType()); - assertEquals("a", queryResult.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a", item.toJavaObject(String.class)); transaction.commit(); } @@ -182,14 +174,12 @@ public void functionAvailableStaticMethodVarArgs1() throws EXistException, XPath try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, queryResult.getType()); - assertTrue(queryResult.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); transaction.commit(); } @@ -206,14 +196,12 @@ public void callStaticMethodVarArgs1Sequence() throws EXistException, XPathExcep try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, queryResult.getType()); - assertEquals("a", queryResult.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a", item.toJavaObject(String.class)); transaction.commit(); } @@ -230,14 +218,12 @@ public void callStaticMethodVarArgs1Array() throws EXistException, XPathExceptio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, queryResult.getType()); - assertEquals("a", queryResult.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a", item.toJavaObject(String.class)); transaction.commit(); } @@ -254,14 +240,12 @@ public void callStaticMethodVarArgs2() throws EXistException, XPathException, Pe try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, queryResult.getType()); - assertEquals("a,b", queryResult.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a,b", item.toJavaObject(String.class)); transaction.commit(); } @@ -278,14 +262,12 @@ public void callStaticMethodVarArgs2Sequence() throws EXistException, XPathExcep try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, queryResult.getType()); - assertEquals("a,b", queryResult.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a,b", item.toJavaObject(String.class)); transaction.commit(); } @@ -302,14 +284,12 @@ public void callStaticMethodVarArgs2Array() throws EXistException, XPathExceptio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, queryResult.getType()); - assertEquals("a,b", queryResult.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a,b", item.toJavaObject(String.class)); transaction.commit(); } @@ -327,14 +307,12 @@ public void functionAvailableStaticMethodVarArgs2() throws EXistException, XPath try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, queryResult.getType()); - assertTrue(queryResult.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); transaction.commit(); } @@ -351,14 +329,12 @@ public void callStaticMethodVarArgs3() throws EXistException, XPathException, Pe try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, queryResult.getType()); - assertEquals("a,b,c", queryResult.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a,b,c", item.toJavaObject(String.class)); transaction.commit(); } @@ -375,14 +351,12 @@ public void callStaticMethodVarArgs3Sequence() throws EXistException, XPathExcep try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, queryResult.getType()); - assertEquals("a,b,c", queryResult.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a,b,c", item.toJavaObject(String.class)); transaction.commit(); } @@ -399,14 +373,12 @@ public void callStaticMethodVarArgs3Array() throws EXistException, XPathExceptio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, queryResult.getType()); - assertEquals("a,b,c", queryResult.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a,b,c", item.toJavaObject(String.class)); transaction.commit(); } @@ -424,14 +396,12 @@ public void functionAvailableStaticMethodVarArgs3() throws EXistException, XPath try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, queryResult.getType()); - assertTrue(queryResult.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); transaction.commit(); } @@ -448,14 +418,12 @@ public void callStaticMethodArrayParam() throws EXistException, XPathException, try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.ARRAY_ITEM, queryResult.getType()); - assertArrayEquals(new String[] {"a", "b"}, queryResult.toJavaObject(String[].class)); + assertEquals(Type.ARRAY_ITEM, item.getType()); + assertArrayEquals(new String[] {"a", "b"}, item.toJavaObject(String[].class)); transaction.commit(); } @@ -474,14 +442,12 @@ public void callStaticMethodArrayParamVarRefExplicitType() throws EXistException try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.ARRAY_ITEM, queryResult.getType()); - assertArrayEquals(new String[] {"a", "b"}, queryResult.toJavaObject(String[].class)); + assertEquals(Type.ARRAY_ITEM, item.getType()); + assertArrayEquals(new String[] {"a", "b"}, item.toJavaObject(String[].class)); transaction.commit(); } @@ -500,14 +466,12 @@ public void callStaticMethodArrayParamVarRefImplicitType() throws EXistException try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.ARRAY_ITEM, queryResult.getType()); - assertArrayEquals(new String[] {"a", "b"}, queryResult.toJavaObject(String[].class)); + assertEquals(Type.ARRAY_ITEM, item.getType()); + assertArrayEquals(new String[] {"a", "b"}, item.toJavaObject(String[].class)); transaction.commit(); } @@ -524,14 +488,12 @@ public void callStaticMethodMapParam() throws EXistException, XPathException, Pe try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.MAP_ITEM, queryResult.getType()); - assertEquals(hashMap(Tuple("a", BigInteger.valueOf(1)), Tuple("b", BigInteger.valueOf(2)), Tuple("c", BigInteger.valueOf(3))), queryResult.toJavaObject(Map.class)); + assertEquals(Type.MAP_ITEM, item.getType()); + assertEquals(hashMap(Tuple("a", BigInteger.valueOf(1)), Tuple("b", BigInteger.valueOf(2)), Tuple("c", BigInteger.valueOf(3))), item.toJavaObject(Map.class)); transaction.commit(); } @@ -550,14 +512,12 @@ public void callStaticMethodMapParamVarRefExplicitType() throws EXistException, try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.MAP_ITEM, queryResult.getType()); - assertEquals(hashMap(Tuple("a", BigInteger.valueOf(1)), Tuple("b", BigInteger.valueOf(2)), Tuple("c", BigInteger.valueOf(3))), queryResult.toJavaObject(Map.class)); + assertEquals(Type.MAP_ITEM, item.getType()); + assertEquals(hashMap(Tuple("a", BigInteger.valueOf(1)), Tuple("b", BigInteger.valueOf(2)), Tuple("c", BigInteger.valueOf(3))), item.toJavaObject(Map.class)); transaction.commit(); } @@ -576,14 +536,12 @@ public void callStaticMethodMapParamVarRefImplicitType() throws EXistException, try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.MAP_ITEM, queryResult.getType()); - assertEquals(hashMap(Tuple("a", BigInteger.valueOf(1)), Tuple("b", BigInteger.valueOf(2)), Tuple("c", BigInteger.valueOf(3))), queryResult.toJavaObject(Map.class)); + assertEquals(Type.MAP_ITEM, item.getType()); + assertEquals(hashMap(Tuple("a", BigInteger.valueOf(1)), Tuple("b", BigInteger.valueOf(2)), Tuple("c", BigInteger.valueOf(3))), item.toJavaObject(Map.class)); transaction.commit(); } @@ -601,14 +559,12 @@ public void functionAvailableStaticMethodArrayParam() throws EXistException, XPa try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, queryResult.getType()); - assertTrue(queryResult.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); transaction.commit(); } @@ -627,14 +583,12 @@ public void callInstanceMethodReturnArray() throws EXistException, XPathExceptio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.ARRAY_ITEM, queryResult.getType()); - assertArrayEquals(new byte[] { 'h', 'e', 'l', 'l', 'o' }, queryResult.toJavaObject(byte[].class)); + assertEquals(Type.ARRAY_ITEM, item.getType()); + assertArrayEquals(new byte[] { 'h', 'e', 'l', 'l', 'o' }, item.toJavaObject(byte[].class)); transaction.commit(); } @@ -652,14 +606,12 @@ public void functionAvailableInstanceMethodReturnArray() throws EXistException, try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, queryResult.getType()); - assertTrue(queryResult.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); transaction.commit(); } @@ -676,14 +628,12 @@ public void callStaticMethodFloat() throws EXistException, XPathException, Permi try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.FLOAT, queryResult.getType()); - assertEquals(1.7000002f, queryResult.toJavaObject(float.class), 0); + assertEquals(Type.FLOAT, item.getType()); + assertEquals(1.7000002f, item.toJavaObject(float.class), 0); transaction.commit(); } @@ -700,14 +650,12 @@ public void callStaticMethodDouble() throws EXistException, XPathException, Perm try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.DOUBLE, queryResult.getType()); - assertEquals(1.7000000000000002d, queryResult.toJavaObject(double.class), 0); + assertEquals(Type.DOUBLE, item.getType()); + assertEquals(1.7000000000000002d, item.toJavaObject(double.class), 0); transaction.commit(); } @@ -724,14 +672,12 @@ public void callStaticField() throws EXistException, XPathException, PermissionD try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.DOUBLE, queryResult.getType()); - assertEquals(3.14159265358979323846, queryResult.toJavaObject(double.class), 0); + assertEquals(Type.DOUBLE, item.getType()); + assertEquals(3.14159265358979323846, item.toJavaObject(double.class), 0); transaction.commit(); } @@ -750,14 +696,12 @@ public void callInstanceField() throws EXistException, XPathException, Permissio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, queryResult.getType()); - assertTrue(queryResult.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); transaction.commit(); } @@ -775,14 +719,12 @@ public void functionAvailableStaticField() throws EXistException, XPathException try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, queryResult.getType()); - assertTrue(queryResult.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); transaction.commit(); } @@ -799,14 +741,12 @@ public void callStringConstructor() throws EXistException, XPathException, Permi try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, queryResult.getType()); - assertEquals("hello world", queryResult.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("hello world", item.toJavaObject(String.class)); transaction.commit(); } @@ -823,14 +763,12 @@ public void callListConstructor() throws EXistException, XPathException, Permiss try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.JAVA_OBJECT, queryResult.getType()); - assertEquals(new ArrayList<>(), queryResult.toJavaObject(List.class)); + assertEquals(Type.JAVA_OBJECT, item.getType()); + assertEquals(new ArrayList<>(), item.toJavaObject(List.class)); transaction.commit(); } @@ -848,14 +786,12 @@ public void functionAvailableInstanceMethod() throws EXistException, XPathExcept try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, queryResult.getType()); - assertTrue(queryResult.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); transaction.commit(); } @@ -874,14 +810,12 @@ public void callInstanceMethod() throws EXistException, XPathException, Permissi try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, queryResult.getType()); - assertEquals("hello world everyone", queryResult.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("hello world everyone", item.toJavaObject(String.class)); transaction.commit(); } @@ -899,14 +833,12 @@ public void functionAvailableConstructor() throws EXistException, XPathException try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, queryResult.getType()); - assertTrue(queryResult.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); transaction.commit(); } @@ -926,14 +858,12 @@ public void callVoidMethodReturnThis() throws EXistException, XPathException, Pe try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.INTEGER, queryResult.getType()); - assertEquals(7, (int) queryResult.toJavaObject(int.class)); + assertEquals(Type.INTEGER, item.getType()); + assertEquals(7, (int) item.toJavaObject(int.class)); transaction.commit(); } @@ -953,14 +883,12 @@ public void buildJavaList() throws EXistException, XPathException, PermissionDen try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, queryResult.getType()); - assertEquals("cherries.apples.bananas", queryResult.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("cherries.apples.bananas", item.toJavaObject(String.class)); transaction.commit(); } @@ -982,14 +910,12 @@ public void buildJavaListWithVoidReturnThis() throws EXistException, XPathExcept try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Item queryResult = withCompiledQuery(broker, query, compiledQuery -> { - final Sequence result = executeQuery(broker, compiledQuery); - assertTrue(result.hasOne()); - return result.itemAt(0); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, queryResult.getType()); - assertEquals("cherries", queryResult.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("cherries", item.toJavaObject(String.class)); transaction.commit(); } diff --git a/exist-core/src/test/java/org/exist/xquery/RestBinariesTest.java b/exist-core/src/test/java/org/exist/xquery/RestBinariesTest.java index a7d2b6acd1..9cf56dd653 100644 --- a/exist-core/src/test/java/org/exist/xquery/RestBinariesTest.java +++ b/exist-core/src/test/java/org/exist/xquery/RestBinariesTest.java @@ -58,6 +58,7 @@ import org.exist.http.rest.Value; import org.exist.test.ExistWebServer; import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream; +import org.exist.util.io.InputStreamUtil; import org.exist.xmldb.XmldbURI; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -72,6 +73,7 @@ import java.io.IOException; import java.io.InputStream; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.http.HttpStatus.SC_CREATED; import static org.apache.http.HttpStatus.SC_OK; import static org.exist.TestUtils.ADMIN_DB_PWD; @@ -195,8 +197,12 @@ private HttpResponse postXquery(final String xquery) throws JAXBException, IOExc ).returnResponse(); } - if(response.getStatusLine().getStatusCode() != SC_OK) { - throw new IOException("Unable to query, HTTP response code: " + response.getStatusLine().getStatusCode()); + if (response.getStatusLine().getStatusCode() != SC_OK) { + final String responseBody; + try (final InputStream is = response.getEntity().getContent()) { + responseBody = InputStreamUtil.readString(is, UTF_8); + } + throw new IOException("Unable to query, HTTP response code: " + response.getStatusLine().getStatusCode() + ": " + responseBody); } return response; diff --git a/exist-core/src/test/java/org/exist/xquery/XQueryContextAttributesTest.java b/exist-core/src/test/java/org/exist/xquery/XQueryContextAttributesTest.java index ec88138af1..8ab5f22ce4 100644 --- a/exist-core/src/test/java/org/exist/xquery/XQueryContextAttributesTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XQueryContextAttributesTest.java @@ -32,17 +32,14 @@ */ package org.exist.xquery; -import com.evolvedbinary.j8fu.function.Function2E; import com.evolvedbinary.j8fu.tuple.Tuple2; import org.exist.EXistException; import org.exist.collections.Collection; import org.exist.dom.persistent.BinaryDocument; import org.exist.security.PermissionDeniedException; import org.exist.source.DBSource; -import org.exist.source.Source; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; import org.exist.storage.lock.Lock; import org.exist.storage.txn.Txn; import org.exist.test.ExistEmbeddedServer; @@ -56,13 +53,13 @@ import org.xml.sax.SAXException; import xyz.elemental.mediatype.MediaType; -import javax.annotation.Nullable; import java.io.IOException; import java.util.Optional; -import java.util.Properties; import static java.nio.charset.StandardCharsets.UTF_8; import static com.evolvedbinary.j8fu.tuple.Tuple.Tuple; +import static org.exist.xquery.XQueryUtil.executeQuery; +import static org.exist.xquery.XQueryUtil.withCompiledQuery; import static org.junit.Assert.*; /** @@ -172,59 +169,4 @@ private static DBSource storeQuery(final DBBroker broker, final Txn transaction, return new DBSource(broker.getBrokerPool(), doc, false); } } - - private static T withCompiledQuery(final DBBroker broker, final Source source, final Function2E op) throws XPathException, PermissionDeniedException, IOException { - final BrokerPool pool = broker.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - final XQueryPool xqueryPool = pool.getXQueryPool(); - final CompiledXQuery compiledQuery = compileQuery(broker, xqueryService, xqueryPool, source); - try { - return op.apply(compiledQuery); - } finally { - if (compiledQuery != null) { - if (compiledQuery.getContext() != null) { - compiledQuery.getContext().runCleanupTasks(); - } - xqueryPool.returnCompiledXQuery(source, compiledQuery); - } - } - } - - private static CompiledXQuery compileQuery(final DBBroker broker, final XQuery xqueryService, final XQueryPool xqueryPool, final Source query) throws PermissionDeniedException, XPathException, IOException { - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - compiled = xqueryPool.borrowCompiledXQuery(broker, query); - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - if (compiled == null) { - compiled = xqueryService.compile(context, query); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } - - return compiled; - - } catch (final PermissionDeniedException | XPathException | IOException e) { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - xqueryPool.returnCompiledXQuery(query, compiled); - } - throw e; - } - } - - static Sequence executeQuery(final DBBroker broker, final CompiledXQuery compiledXQuery) throws PermissionDeniedException, XPathException { - final BrokerPool pool = broker.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - return xqueryService.execute(broker, compiledXQuery, null, new Properties()); - } } diff --git a/exist-core/src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java b/exist-core/src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java index b26e0ba2fd..c4f14cfb35 100644 --- a/exist-core/src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java @@ -53,6 +53,7 @@ import org.exist.dom.memtree.ElementImpl; import org.exist.dom.memtree.MemTreeBuilder; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.serializers.Serializer; @@ -97,7 +98,7 @@ public class XQueryDeclareContextItemTest { @BeforeClass public static void setup() throws EXistException, PermissionDeniedException, IOException, SAXException, LockException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = pool.getTransactionManager().beginTransaction()) { final Collection root = broker.getOrCreateCollection(transaction, @@ -115,11 +116,11 @@ public static void setup() throws EXistException, PermissionDeniedException, IOE @AfterClass public static void cleanup() throws EXistException, PermissionDeniedException, IOException, TriggerException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = pool.getTransactionManager().beginTransaction()) { final Collection test = broker.getCollection(TestConstants.TEST_COLLECTION_URI); - if(test != null) { + if (test != null) { broker.removeCollection(transaction, test); } @@ -128,17 +129,15 @@ public static void cleanup() throws EXistException, PermissionDeniedException, I } @Test - public void declareContextItem() throws EXistException, PermissionDeniedException, XPathException { + public void declareContextItem() throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "xquery version \"3.0\";\n" + "declare context item := 3; \n" + ". + 4"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); - - try(final DBBroker broker = pool.getBroker()) { - final Sequence result = xquery.execute(broker, query, null); + try (final DBBroker broker = pool.getBroker()) { + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, result.getItemCount()); assertEquals(7, (int)result.itemAt(0).toJavaObject(int.class)); } @@ -148,92 +147,82 @@ public void declareContextItem() throws EXistException, PermissionDeniedExceptio * See issue https://github.com/eXist-db/exist/issues/2156 */ @Test - public void declareContextItemIsDocument() throws EXistException, PermissionDeniedException, XPathException { + public void declareContextItemIsDocument() throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "xquery version \"3.0\";\n" + "declare context item := document { foobaz }; \n" + "(/) instance of document-node()"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); - - try(final DBBroker broker = pool.getBroker()) { - final Sequence result = xquery.execute(broker, query, null); + try (final DBBroker broker = pool.getBroker()) { + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, result.getItemCount()); assertEquals(true, result.effectiveBooleanValue()); } } @Test - public void declareContextItemTyped() throws EXistException, PermissionDeniedException, XPathException { + public void declareContextItemTyped() throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "xquery version \"3.0\";\n" + "declare context item as xs:integer := 3; \n" + ". + 4"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); - - try(final DBBroker broker = pool.getBroker()) { - final Sequence result = xquery.execute(broker, query, null); + try (final DBBroker broker = pool.getBroker()) { + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, result.getItemCount()); assertEquals(7, (int)result.itemAt(0).toJavaObject(int.class)); } } @Test - public void declareContextItemExternal() throws EXistException, PermissionDeniedException, XPathException { + public void declareContextItemExternal() throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "xquery version \"3.0\";\n" + "declare context item external; \n" + ". + 4"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); - - try(final DBBroker broker = pool.getBroker()) { - final Sequence result = xquery.execute(broker, query, new IntegerValue(3)); + try (final DBBroker broker = pool.getBroker()) { + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, new IntegerValue(3), null, null, null, null).result; assertEquals(1, result.getItemCount()); assertEquals(7, (int)result.itemAt(0).toJavaObject(int.class)); } } @Test - public void declareContextItemExternalDefault() throws EXistException, PermissionDeniedException, XPathException { + public void declareContextItemExternalDefault() throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "xquery version \"3.0\";\n" + "declare context item external := 3; \n" + ". + 4"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); - - try(final DBBroker broker = pool.getBroker()) { - final Sequence result = xquery.execute(broker, query, null); + try (final DBBroker broker = pool.getBroker()) { + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, result.getItemCount()); assertEquals(7, (int)result.itemAt(0).toJavaObject(int.class)); } } @Test - public void declareContextItemExternalDefaultOverrides() throws EXistException, PermissionDeniedException, XPathException { + public void declareContextItemExternalDefaultOverrides() throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "xquery version \"3.0\";\n" + "declare context item external := 3; \n" + ". + 4"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); - - try(final DBBroker broker = pool.getBroker()) { - final Sequence result = xquery.execute(broker, query, new IntegerValue(20)); + try (final DBBroker broker = pool.getBroker()) { + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, new IntegerValue(20), null, null, null, null).result; assertEquals(1, result.getItemCount()); assertEquals(24, (int)result.itemAt(0).toJavaObject(int.class)); } } @Test - public void declareContextItemExternalElement() throws EXistException, PermissionDeniedException, XPathException, SAXException { + public void declareContextItemExternalElement() throws EXistException, PermissionDeniedException, XPathException, SAXException, IOException { final String query = "xquery version \"3.0\";\n" + "declare namespace env=\"http://www.w3.org/2003/05/soap-envelope\";\n" + @@ -241,9 +230,7 @@ public void declareContextItemExternalElement() throws EXistException, Permissio "{.}"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); - - try(final DBBroker broker = pool.getBroker()) { + try (final DBBroker broker = pool.getBroker()) { final MemTreeBuilder builder = new MemTreeBuilder(); builder.startDocument(); builder.startElement(new QName("Envelope", "http://www.w3.org/2003/05/soap-envelope"), null); @@ -252,14 +239,14 @@ public void declareContextItemExternalElement() throws EXistException, Permissio final ElementImpl elem = (ElementImpl)builder.getDocument().getDocumentElement(); - final Sequence result = xquery.execute(broker, query, elem); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, elem, null, null, null, null).result; assertEquals(1, result.getItemCount()); assertEquals("", serialize(broker, (NodeValue)result.itemAt(0))); } } @Test - public void contextItemExternalDefaultElement() throws EXistException, SAXException, PermissionDeniedException, XPathException { + public void contextItemExternalDefaultElement() throws EXistException, SAXException, PermissionDeniedException, XPathException, IOException { final String query = "xquery version \"3.0\";\n" + "declare namespace sys=\"http://syslog\";\n" + @@ -267,10 +254,8 @@ public void contextItemExternalDefaultElement() throws EXistException, SAXExcept "{.}"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); - - try(final DBBroker broker = pool.getBroker()) { - final Sequence result = xquery.execute(broker, query, null); + try (final DBBroker broker = pool.getBroker()) { + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, result.getItemCount()); assertEquals("some-event", serialize(broker, (NodeValue)result.itemAt(0))); } diff --git a/exist-core/src/test/java/org/exist/xquery/XQueryTest.java b/exist-core/src/test/java/org/exist/xquery/XQueryTest.java index 09fb4b3c16..697a72fc79 100644 --- a/exist-core/src/test/java/org/exist/xquery/XQueryTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XQueryTest.java @@ -45,6 +45,7 @@ */ package org.exist.xquery; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.EXistException; @@ -53,14 +54,12 @@ import org.exist.source.SourceFactory; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.xmldb.EXistResource; import org.exist.xmldb.EXistXPathQueryService; import org.exist.xmldb.XmldbURI; import org.exist.xquery.value.IntegerValue; import org.exist.xquery.value.Item; -import org.exist.xquery.value.Sequence; import org.exist.xquery.value.Type; import org.junit.*; import org.w3c.dom.Document; @@ -79,7 +78,6 @@ import org.xmlunit.matchers.CompareMatcher; import xyz.elemental.mediatype.MediaType; -import javax.annotation.Nullable; import javax.xml.transform.OutputKeys; import javax.xml.transform.Source; import java.io.IOException; @@ -1142,50 +1140,27 @@ public void importExternalClasspathMainModule() throws EXistException, IOExcepti try (final DBBroker broker = brokerPool.getBroker()) { final org.exist.source.Source source = SourceFactory.getSource(broker, "/", "resource:org/exist/xquery/external-classpath-main-module.xq", false); - final XQuery xquery = brokerPool.getXQueryService(); - final XQueryPool queryPool = brokerPool.getXQueryPool(); - - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - compiled = queryPool.borrowCompiledXQuery(broker, source); - if (compiled == null) { - context = new XQueryContext(brokerPool); - } else { - context = compiled.getContext(); - context.prepareForReuse(); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + try { + xqueryContext.declareVariable(new QName("s"), true, new IntegerValue(timestamp)); + } catch (final QName.IllegalQNameException e) { + throw new XPathException(e.getMessage(), e); } + }; - context.declareVariable(new QName("s"), true, new IntegerValue(timestamp)); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, setupXqueryContextPreCompilation, null, null); - if (compiled == null) { - compiled = xquery.compile(context, source); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } + assertEquals(1, queryResult.result.getItemCount()); + final Item item = queryResult.result.itemAt(0); + assertTrue(Type.subTypeOf(item.getType(), Type.NODE)); - final Sequence result = xquery.execute(broker, compiled, null, null); - assertEquals(1, result.getItemCount()); - final Item item = result.itemAt(0); - assertTrue(Type.subTypeOf(item.getType(), Type.NODE)); - - final Source expected = Input.fromString("" + timestamp + "").build(); - final Source actual = Input.fromNode((Node)item).build(); - final Diff diff = DiffBuilder.compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); - assertFalse(diff.toString(), diff.hasDifferences()); - - } finally { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - queryPool.returnCompiledXQuery(source, compiled); - } - } + final Source expected = Input.fromString("" + timestamp + "").build(); + final Source actual = Input.fromNode((Node)item).build(); + final Diff diff = DiffBuilder.compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); + assertFalse(diff.toString(), diff.hasDifferences()); } } diff --git a/exist-core/src/test/java/org/exist/xquery/XQueryUpdateTest.java b/exist-core/src/test/java/org/exist/xquery/XQueryUpdateTest.java index 5812a76f7c..d01cf77d4a 100644 --- a/exist-core/src/test/java/org/exist/xquery/XQueryUpdateTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XQueryUpdateTest.java @@ -53,6 +53,7 @@ import org.exist.collections.triggers.TriggerException; import org.exist.dom.persistent.DocumentImpl; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.serializers.Serializer; @@ -84,11 +85,10 @@ public class XQueryUpdateTest { protected final static int ITEMS_TO_APPEND = 500; @Test - public void append() throws EXistException, PermissionDeniedException, XPathException, SAXException { + public void append() throws EXistException, PermissionDeniedException, XPathException, SAXException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); String query = " declare variable $i external;\n" + " update insert\n" + @@ -98,14 +98,15 @@ public void append() throws EXistException, PermissionDeniedException, XPathExce " {$i * 10}\n" + " \n" + " into /products"; - XQueryContext context = new XQueryContext(pool); - CompiledXQuery compiled = xquery.compile(context, query); + final XQueryContext context = new XQueryContext(pool); + final CompiledXQuery compiled = pool.getXQueryService().compile(context, query); for (int i = 0; i < ITEMS_TO_APPEND; i++) { context.declareVariable("i", true, Integer.valueOf(i)); - xquery.execute(broker, compiled, null); + pool.getXQueryService().execute(broker, compiled, null); } - Sequence seq = xquery.execute(broker, "/products", null); + query = "/products"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(seq.getItemCount(), 1); final Serializer serializer = broker.borrowSerializer(); @@ -115,10 +116,12 @@ public void append() throws EXistException, PermissionDeniedException, XPathExce broker.returnSerializer(serializer); } - seq = xquery.execute(broker, "//product", null); + query = "//product"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); - seq = xquery.execute(broker, "//product[price > 0.0]", null); + query = "//product[price > 0.0]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); } } @@ -129,41 +132,44 @@ public void appendAttributes() throws EXistException, PermissionDeniedException, append(); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); String query = " declare variable $i external;\n" + " update insert\n" + " attribute name { concat('n', $i) }\n" + " into //product[@num = $i]"; - XQueryContext context = new XQueryContext(pool); - CompiledXQuery compiled = xquery.compile(context, query); + final XQueryContext context = new XQueryContext(pool); + final CompiledXQuery compiled = pool.getXQueryService().compile(context, query); for (int i = 0; i < ITEMS_TO_APPEND; i++) { context.declareVariable("i", true, Integer.valueOf(i)); - xquery.execute(broker, compiled, null); + pool.getXQueryService().execute(broker, compiled, null); } - Sequence seq = xquery.execute(broker, "/products", null); + query = "/products"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(seq.getItemCount(), 1); final Serializer serializer = broker.borrowSerializer(); try { serializer.serialize((NodeValue) seq.itemAt(0)); - seq = xquery.execute(broker, "//product", null); + query = "//product"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); - seq = xquery.execute(broker, "//product[@name = 'n20']", null); + query = "//product[@name = 'n20']"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, seq.getItemCount()); store(broker, "attribs.xml", "ccc"); query = "update insert attribute attr1 { 'eee' } into /test"; //testing duplicate attribute ... - xquery.execute(broker, query, null); + XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); - seq = xquery.execute(broker, "doc('" + TEST_COLLECTION + "/attribs.xml')/test[@attr1 = 'eee']", null); + query = "doc('" + TEST_COLLECTION + "/attribs.xml')/test[@attr1 = 'eee']"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, seq.getItemCount()); serializer.serialize((NodeValue) seq.itemAt(0)); @@ -174,9 +180,9 @@ public void appendAttributes() throws EXistException, PermissionDeniedException, } @Test - public void insertBefore() throws EXistException, PermissionDeniedException, XPathException, SAXException { + public void insertBefore() throws EXistException, PermissionDeniedException, XPathException, SAXException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = " update insert\n" + @@ -187,10 +193,10 @@ public void insertBefore() throws EXistException, PermissionDeniedException, XPa " \n" + " into /products"; - XQuery xquery = pool.getXQueryService(); - xquery.execute(broker, query, null); + XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); - Sequence seq = xquery.execute(broker, "//product", null); + query = "//product"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, seq.getItemCount()); query = @@ -202,14 +208,15 @@ public void insertBefore() throws EXistException, PermissionDeniedException, XPa " {$i * 10}\n" + " \n" + " preceding /products/product[1]"; - XQueryContext context = new XQueryContext(pool); - CompiledXQuery compiled = xquery.compile(context, query); + final XQueryContext context = new XQueryContext(pool); + final CompiledXQuery compiled = pool.getXQueryService().compile(context, query); for (int i = 0; i < ITEMS_TO_APPEND; i++) { context.declareVariable("i", true, Integer.valueOf(i)); - xquery.execute(broker, compiled, null); + pool.getXQueryService().execute(broker, compiled, null); } - seq = xquery.execute(broker, "/products", null); + query = "/products"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(seq.getItemCount(), 1); final Serializer serializer = broker.borrowSerializer(); @@ -219,18 +226,20 @@ public void insertBefore() throws EXistException, PermissionDeniedException, XPa broker.returnSerializer(serializer); } - seq = xquery.execute(broker, "//product", null); + query = "//product"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(ITEMS_TO_APPEND + 1, seq.getItemCount()); - seq = xquery.execute(broker, "//product[price > 0.0]", null); + query = "//product[price > 0.0]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); } } @Test - public void insertAfter() throws EXistException, PermissionDeniedException, XPathException, SAXException { + public void insertAfter() throws EXistException, PermissionDeniedException, XPathException, SAXException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = " update insert\n" + @@ -241,10 +250,10 @@ public void insertAfter() throws EXistException, PermissionDeniedException, XPat " \n" + " into /products"; - XQuery xquery = pool.getXQueryService(); - xquery.execute(broker, query, null); + XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); - Sequence seq = xquery.execute(broker, "//product", null); + query = "//product"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, seq.getItemCount()); query = @@ -256,14 +265,15 @@ public void insertAfter() throws EXistException, PermissionDeniedException, XPat " {$i * 10}\n" + " \n" + " following /products/product[1]"; - XQueryContext context = new XQueryContext(pool); - CompiledXQuery compiled = xquery.compile(context, query); + final XQueryContext context = new XQueryContext(pool); + final CompiledXQuery compiled = pool.getXQueryService().compile(context, query); for (int i = 0; i < ITEMS_TO_APPEND; i++) { context.declareVariable("i", true, Integer.valueOf(i)); - xquery.execute(broker, compiled, null); + pool.getXQueryService().execute(broker, compiled, null); } - seq = xquery.execute(broker, "/products", null); + query = "/products"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(seq.getItemCount(), 1); final Serializer serializer = broker.borrowSerializer(); @@ -273,52 +283,59 @@ public void insertAfter() throws EXistException, PermissionDeniedException, XPat broker.returnSerializer(serializer); } - seq = xquery.execute(broker, "//product", null); + query = "//product"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(ITEMS_TO_APPEND + 1, seq.getItemCount()); - seq = xquery.execute(broker, "//product[price > 0.0]", null); + query = "//product[price > 0.0]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); } } @Test - public void update() throws EXistException, PermissionDeniedException, XPathException, SAXException { + public void update() throws EXistException, PermissionDeniedException, XPathException, SAXException, IOException { append(); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); - String query = "declare option exist:output-size-limit '-1';\n" + "for $prod at $i in //product return\n" + " update value $prod/description\n" + " with 'Updated Description ' || $i"; - Sequence seq = xquery.execute(broker, query, null); + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - seq = xquery.execute(broker, "count(//product[starts-with(description, 'Updated')])", null); + query = "count(//product[starts-with(description, 'Updated')])"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(ITEMS_TO_APPEND, (int)seq.itemAt(0).toJavaObject(int.class)); for (int i = 1; i <= ITEMS_TO_APPEND; i++) { - seq = xquery.execute(broker, "//product[description eq 'Updated Description " + i + "']", null); + query = "//product[description eq 'Updated Description " + i + "']"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, seq.getItemCount()); } - seq = xquery.execute(broker, "//product[stock cast as xs:double gt 400]", null); + query = "//product[stock cast as xs:double gt 400]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(459, seq.getItemCount()); - seq = xquery.execute(broker, "//product[starts-with(stock, '401')]", null); + query = "//product[starts-with(stock, '401')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/products", null); + query = "/products"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "//product[@num cast as xs:integer eq 3]", null); + query = "//product[@num cast as xs:integer eq 3]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/products", null); + query = "/products"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, seq.getItemCount()); query = @@ -326,94 +343,96 @@ public void update() throws EXistException, PermissionDeniedException, XPathExce "for $prod in //product return\n" + " update value $prod/stock\n" + " with (10,1)"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - seq = xquery.execute(broker, "//product/stock/external[. cast as xs:integer eq 1]", null); + query = "//product/stock/external[. cast as xs:integer eq 1]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); } } @Test - public void remove() throws EXistException, PermissionDeniedException, XPathException, SAXException { + public void remove() throws EXistException, PermissionDeniedException, XPathException, SAXException, IOException { append(); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "for $prod in //product return\n" + " update delete $prod\n"; - Sequence seq = xquery.execute(broker, query, null); + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - seq = xquery.execute(broker, "//product", null); + query = "//product"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(seq.getItemCount(), 0); } } @Test - public void rename() throws EXistException, PermissionDeniedException, XPathException, SAXException { + public void rename() throws EXistException, PermissionDeniedException, XPathException, SAXException, IOException { append(); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - - XQuery xquery = pool.getXQueryService(); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "for $prod in //product return\n" + " update rename $prod/description as 'desc'\n"; - Sequence seq = xquery.execute(broker, query, null); + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - seq = xquery.execute(broker, "//product/desc", null); + query = "//product/desc"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); query = "for $prod in //product return\n" + " update rename $prod/@num as 'count'\n"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - seq = xquery.execute(broker, "//product/@count", null); + query = "//product/@count"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); } } @Test - public void replace() throws EXistException, PermissionDeniedException, XPathException, SAXException { + public void replace() throws EXistException, PermissionDeniedException, XPathException, SAXException, IOException { append(); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - - XQuery xquery = pool.getXQueryService(); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "for $prod in //product return\n" + " update replace $prod/description with An updated description.\n"; - Sequence seq = xquery.execute(broker, query, null); + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - seq = xquery.execute(broker, "//product/desc", null); + query = "//product/desc"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); query = "for $prod in //product return\n" + " update replace $prod/@num with '1'\n"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - seq = xquery.execute(broker, "//product/@num", null); + query = "//product/@num"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); query = "for $prod in //product return\n" + " update replace $prod/desc/text() with 'A new update'\n"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - seq = xquery.execute(broker, "//product[starts-with(desc, 'A new')]", null); + query = "//product[starts-with(desc, 'A new')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); } } @@ -421,7 +440,7 @@ public void replace() throws EXistException, PermissionDeniedException, XPathExc @Test public void attrUpdate() throws EXistException, LockException, SAXException, PermissionDeniedException, IOException, XPathException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { store(broker, "test.xml", UPDATE_XML); String query = @@ -432,31 +451,29 @@ public void attrUpdate() throws EXistException, LockException, SAXException, Per " update value $done with xs:int($done + 1),\n" + " xs:int(/progress/@done)\n" + ")"; - XQuery xquery = pool.getXQueryService(); - @SuppressWarnings("unused") - Sequence result = xquery.execute(broker, query, null); + + XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); } } @Test - public void appendCDATA() throws EXistException, PermissionDeniedException, XPathException, SAXException { + public void appendCDATA() throws EXistException, PermissionDeniedException, XPathException, SAXException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - - XQuery xquery = pool.getXQueryService(); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = " update insert\n" + " \n" + " ]]>\n" + " \n" + " into /products"; - XQueryContext context = new XQueryContext(pool); - CompiledXQuery compiled = xquery.compile(context, query); + final XQueryContext context = new XQueryContext(pool); + final CompiledXQuery compiled = pool.getXQueryService().compile(context, query); for (int i = 0; i < ITEMS_TO_APPEND; i++) { - xquery.execute(broker, compiled, null); + pool.getXQueryService().execute(broker, compiled, null); } - Sequence seq = xquery.execute(broker, "/products", null); + query = "/products"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(seq.getItemCount(), 1); final Serializer serializer = broker.borrowSerializer(); @@ -466,13 +483,14 @@ public void appendCDATA() throws EXistException, PermissionDeniedException, XPat broker.returnSerializer(serializer); } - seq = xquery.execute(broker, "//product", null); + query = "//product"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); } } @Test - public void insertAttrib() throws EXistException, PermissionDeniedException, XPathException { + public void insertAttrib() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = @@ -482,11 +500,10 @@ public void insertAttrib() throws EXistException, PermissionDeniedException, XPa "let $attrib := /@* "+ "return update insert $attrib into $node"; - XQuery xquery = pool.getXQueryService(); - xquery.execute(broker, query, null); + XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); query = "doc('/db/insertAttribDoc.xml')/element()[@f eq 'ATTRIB VALUE']"; - Sequence result = xquery.execute(broker, query, null); + Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertFalse(result.isEmpty()); } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/CollectionTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/CollectionTest.java index 4b99296e76..85091889d6 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/CollectionTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/CollectionTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -19,14 +43,15 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - package org.exist.xquery.functions.fn; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.exist.EXistException; import org.exist.Namespaces; import org.exist.dom.memtree.DocumentImpl; import org.exist.dom.memtree.SAXAdapter; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.test.ExistXmldbEmbeddedServer; @@ -69,7 +94,7 @@ public class CollectionTest { } @Test - public void doc_dynamicallyAvailableCollection_absoluteUri() throws XPathException, EXistException, PermissionDeniedException { + public void doc_dynamicallyAvailableCollection_absoluteUri() throws XPathException, EXistException, PermissionDeniedException, IOException { final BrokerPool pool = BrokerPool.getInstance(); final String doc = "" + System.currentTimeMillis() + ""; @@ -77,12 +102,12 @@ public void doc_dynamicallyAvailableCollection_absoluteUri() throws XPathExcepti final String query = "fn:collection('" + collectionUri + "')"; try (final DBBroker broker = pool.getBroker()) { - final XQueryContext context = new XQueryContext(pool); - context.addDynamicallyAvailableCollection(collectionUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.addDynamicallyAvailableCollection(collectionUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); + }; - final XQuery xqueryService = pool.getXQueryService(); - final CompiledXQuery compiled = xqueryService.compile(context, query); - final Sequence result = xqueryService.execute(broker, compiled, null); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); + final Sequence result = queryResult.result; assertFalse(result.isEmpty()); assertEquals(1, result.getItemCount()); @@ -101,7 +126,7 @@ public void doc_dynamicallyAvailableCollection_absoluteUri() throws XPathExcepti } @Test - public void doc_dynamicallyAvailableCollection_relativeUri() throws XPathException, EXistException, PermissionDeniedException, URISyntaxException { + public void doc_dynamicallyAvailableCollection_relativeUri() throws XPathException, EXistException, PermissionDeniedException, URISyntaxException, IOException { final BrokerPool pool = BrokerPool.getInstance(); final String doc = "" + System.currentTimeMillis() + ""; @@ -110,13 +135,17 @@ public void doc_dynamicallyAvailableCollection_relativeUri() throws XPathExcepti final String query = "fn:collection('" + collectionRelativeUri + "')"; try (final DBBroker broker = pool.getBroker()) { - final XQueryContext context = new XQueryContext(pool); - context.setBaseURI(new AnyURIValue(new URI(baseUri))); - context.addDynamicallyAvailableCollection(baseUri + collectionRelativeUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); - - final XQuery xqueryService = pool.getXQueryService(); - final CompiledXQuery compiled = xqueryService.compile(context, query); - final Sequence result = xqueryService.execute(broker, compiled, null); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + try { + xqueryContext.setBaseURI(new AnyURIValue(new URI(baseUri))); + } catch (final URISyntaxException e) { + throw new XPathException(e.getMessage(), e); + } + xqueryContext.addDynamicallyAvailableCollection(baseUri + collectionRelativeUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); + }; + + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); + final Sequence result = queryResult.result; assertFalse(result.isEmpty()); assertEquals(1, result.getItemCount()); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/DocTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/DocTest.java index bd3043c51d..cf0eb1a95c 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/DocTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/DocTest.java @@ -46,11 +46,13 @@ package org.exist.xquery.functions.fn; import com.evolvedbinary.j8fu.Either; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.exist.EXistException; import org.exist.Namespaces; import org.exist.dom.memtree.DocumentImpl; import org.exist.dom.memtree.SAXAdapter; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.test.ExistXmldbEmbeddedServer; @@ -177,7 +179,7 @@ public void testURIResolveWithEval() throws XMLDBException { } @Test - public void doc_dynamicallyAvailableDocument_absoluteUri() throws XPathException, EXistException, PermissionDeniedException { + public void doc_dynamicallyAvailableDocument_absoluteUri() throws XPathException, EXistException, PermissionDeniedException, IOException { final BrokerPool pool = BrokerPool.getInstance(); final String doc = "" + System.currentTimeMillis() + ""; @@ -185,12 +187,13 @@ public void doc_dynamicallyAvailableDocument_absoluteUri() throws XPathException final String query = "fn:doc('" + docUri + "')"; try (final DBBroker broker = pool.getBroker()) { - final XQueryContext context = new XQueryContext(pool); - context.addDynamicallyAvailableDocument(docUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); - final XQuery xqueryService = pool.getXQueryService(); - final CompiledXQuery compiled = xqueryService.compile(context, query); - final Sequence result = xqueryService.execute(broker, compiled, null); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.addDynamicallyAvailableDocument(docUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); + }; + + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); + final Sequence result = queryResult.result; assertFalse(result.isEmpty()); assertEquals(1, result.getItemCount()); @@ -209,7 +212,7 @@ public void doc_dynamicallyAvailableDocument_absoluteUri() throws XPathException } @Test - public void doc_dynamicallyAvailableDocument_relativeUri() throws XPathException, EXistException, PermissionDeniedException, URISyntaxException { + public void doc_dynamicallyAvailableDocument_relativeUri() throws XPathException, EXistException, PermissionDeniedException, URISyntaxException, IOException { final BrokerPool pool = BrokerPool.getInstance(); final String doc = "" + System.currentTimeMillis() + ""; @@ -218,13 +221,18 @@ public void doc_dynamicallyAvailableDocument_relativeUri() throws XPathException final String query = "fn:doc('" + docRelativeUri + "')"; try (final DBBroker broker = pool.getBroker()) { - final XQueryContext context = new XQueryContext(pool); - context.setBaseURI(new AnyURIValue(new URI(baseUri))); - context.addDynamicallyAvailableDocument(baseUri + docRelativeUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); - final XQuery xqueryService = pool.getXQueryService(); - final CompiledXQuery compiled = xqueryService.compile(context, query); - final Sequence result = xqueryService.execute(broker, compiled, null); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + try { + xqueryContext.setBaseURI(new AnyURIValue(new URI(baseUri))); + } catch (final URISyntaxException e) { + throw new XPathException(e.getMessage(), e); + } + xqueryContext.addDynamicallyAvailableDocument(baseUri + docRelativeUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); + }; + + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); + final Sequence result = queryResult.result; assertFalse(result.isEmpty()); assertEquals(1, result.getItemCount()); @@ -243,7 +251,7 @@ public void doc_dynamicallyAvailableDocument_relativeUri() throws XPathException } @Test - public void docAvailable_dynamicallyAvailableDocument_absoluteUri() throws XPathException, EXistException, PermissionDeniedException { + public void docAvailable_dynamicallyAvailableDocument_absoluteUri() throws XPathException, EXistException, PermissionDeniedException, IOException { final BrokerPool pool = BrokerPool.getInstance(); final String doc = "" + System.currentTimeMillis() + ""; @@ -251,12 +259,13 @@ public void docAvailable_dynamicallyAvailableDocument_absoluteUri() throws XPath final String query = "fn:doc-available('" + docUri + "')"; try (final DBBroker broker = pool.getBroker()) { - final XQueryContext context = new XQueryContext(pool); - context.addDynamicallyAvailableDocument(docUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); - final XQuery xqueryService = pool.getXQueryService(); - final CompiledXQuery compiled = xqueryService.compile(context, query); - final Sequence result = xqueryService.execute(broker, compiled, null); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.addDynamicallyAvailableDocument(docUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); + }; + + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); + final Sequence result = queryResult.result; assertFalse(result.isEmpty()); assertEquals(1, result.getItemCount()); @@ -265,7 +274,7 @@ public void docAvailable_dynamicallyAvailableDocument_absoluteUri() throws XPath } @Test - public void docAvailable_dynamicallyAvailableDocument_relativeUri() throws XPathException, EXistException, PermissionDeniedException, URISyntaxException { + public void docAvailable_dynamicallyAvailableDocument_relativeUri() throws XPathException, EXistException, PermissionDeniedException, URISyntaxException, IOException { final BrokerPool pool = BrokerPool.getInstance(); final String doc = "" + System.currentTimeMillis() + ""; @@ -274,13 +283,17 @@ public void docAvailable_dynamicallyAvailableDocument_relativeUri() throws XPath final String query = "fn:doc-available('" + docRelativeUri + "')"; try (final DBBroker broker = pool.getBroker()) { - final XQueryContext context = new XQueryContext(pool); - context.setBaseURI(new AnyURIValue(new URI(baseUri))); - context.addDynamicallyAvailableDocument(baseUri + docRelativeUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); - - final XQuery xqueryService = pool.getXQueryService(); - final CompiledXQuery compiled = xqueryService.compile(context, query); - final Sequence result = xqueryService.execute(broker, compiled, null); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + try { + xqueryContext.setBaseURI(new AnyURIValue(new URI(baseUri))); + } catch (final URISyntaxException e) { + throw new XPathException(e.getMessage(), e); + } + xqueryContext.addDynamicallyAvailableDocument(baseUri + docRelativeUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); + }; + + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); + final Sequence result = queryResult.result; assertFalse(result.isEmpty()); assertEquals(1, result.getItemCount()); @@ -289,16 +302,13 @@ public void docAvailable_dynamicallyAvailableDocument_relativeUri() throws XPath } @Test - public void docAvailableInPredicate() throws XPathException, EXistException, PermissionDeniedException { + public void docAvailableInPredicate() throws XPathException, EXistException, PermissionDeniedException, IOException { final BrokerPool pool = BrokerPool.getInstance(); final String query = "('/db/test.xml', '/db/test/test.xml', '/db/non-existent.xml')[fn:doc-available(.)]"; try (final DBBroker broker = pool.getBroker()) { - final XQueryContext context = new XQueryContext(pool); - - final XQuery xqueryService = pool.getXQueryService(); - final CompiledXQuery compiled = xqueryService.compile(context, query); - final Sequence result = xqueryService.execute(broker, compiled, null); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + final Sequence result = queryResult.result; assertFalse(result.isEmpty()); assertEquals(2, result.getItemCount()); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/FunUnparsedTextTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/FunUnparsedTextTest.java index 7bb639580b..0479c72dab 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/FunUnparsedTextTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/FunUnparsedTextTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -19,19 +43,19 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - package org.exist.xquery.functions.fn; +import com.evolvedbinary.j8fu.function.ConsumerE; import com.googlecode.junittoolbox.ParallelRunner; import org.exist.EXistException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.test.ExistXmldbEmbeddedServer; -import org.exist.xquery.CompiledXQuery; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.AnyURIValue; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.Type; @@ -40,6 +64,7 @@ import org.junit.runner.RunWith; import java.io.ByteArrayInputStream; +import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; @@ -57,7 +82,7 @@ public class FunUnparsedTextTest { public static final ExistXmldbEmbeddedServer existEmbeddedServer = new ExistXmldbEmbeddedServer(false, true, true); @Test - public void unparsedText_dynamicallyAvailableDocument_absoluteUri() throws XPathException, EXistException, PermissionDeniedException { + public void unparsedText_dynamicallyAvailableDocument_absoluteUri() throws XPathException, EXistException, PermissionDeniedException, IOException { final BrokerPool pool = BrokerPool.getInstance(); final String text = "hello, the time is: " + System.currentTimeMillis(); @@ -65,12 +90,13 @@ public void unparsedText_dynamicallyAvailableDocument_absoluteUri() throws XPath final String query = "fn:unparsed-text('" + textUri + "')"; try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQueryContext context = new XQueryContext(pool); - context.addDynamicallyAvailableTextResource(textUri, UTF_8, (broker2, transaction, uri, charset) -> new InputStreamReader(new ByteArrayInputStream(text.getBytes(UTF_8)), charset)); - final XQuery xqueryService = pool.getXQueryService(); - final CompiledXQuery compiled = xqueryService.compile(context, query); - final Sequence result = xqueryService.execute(broker, compiled, null); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.addDynamicallyAvailableTextResource(textUri, UTF_8, (broker2, transaction, uri, charset) -> new InputStreamReader(new ByteArrayInputStream(text.getBytes(UTF_8)), charset)); + }; + + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); + final Sequence result = queryResult.result; assertFalse(result.isEmpty()); assertEquals(1, result.getItemCount()); @@ -80,7 +106,7 @@ public void unparsedText_dynamicallyAvailableDocument_absoluteUri() throws XPath } @Test - public void unparsedText_dynamicallyAvailableDocument_relativeUri() throws XPathException, EXistException, PermissionDeniedException, URISyntaxException { + public void unparsedText_dynamicallyAvailableDocument_relativeUri() throws XPathException, EXistException, PermissionDeniedException, URISyntaxException, IOException { final BrokerPool pool = BrokerPool.getInstance(); final String text = "hello, the time is: " + System.currentTimeMillis(); @@ -89,13 +115,18 @@ public void unparsedText_dynamicallyAvailableDocument_relativeUri() throws XPath final String query = "fn:unparsed-text('" + textRelativeUri + "')"; try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQueryContext context = new XQueryContext(pool); - context.setBaseURI(new AnyURIValue(new URI(baseUri))); - context.addDynamicallyAvailableTextResource(baseUri + textRelativeUri, UTF_8, (broker2, transaction, uri, charset) -> new InputStreamReader(new ByteArrayInputStream(text.getBytes(UTF_8)), charset)); - final XQuery xqueryService = pool.getXQueryService(); - final CompiledXQuery compiled = xqueryService.compile(context, query); - final Sequence result = xqueryService.execute(broker, compiled, null); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + try { + xqueryContext.setBaseURI(new AnyURIValue(new URI(baseUri))); + xqueryContext.addDynamicallyAvailableTextResource(baseUri + textRelativeUri, UTF_8, (broker2, transaction, uri, charset) -> new InputStreamReader(new ByteArrayInputStream(text.getBytes(UTF_8)), charset)); + } catch (final URISyntaxException e) { + throw new XPathException(e); + } + }; + + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); + final Sequence result = queryResult.result; assertFalse(result.isEmpty()); assertEquals(1, result.getItemCount()); @@ -105,7 +136,7 @@ public void unparsedText_dynamicallyAvailableDocument_relativeUri() throws XPath } @Test - public void unparsedTextAvailable_dynamicallyAvailableDocument_absoluteUri() throws XPathException, EXistException, PermissionDeniedException { + public void unparsedTextAvailable_dynamicallyAvailableDocument_absoluteUri() throws XPathException, EXistException, PermissionDeniedException, IOException { final BrokerPool pool = BrokerPool.getInstance(); final String text = "hello, the time is: " + System.currentTimeMillis(); @@ -113,12 +144,13 @@ public void unparsedTextAvailable_dynamicallyAvailableDocument_absoluteUri() thr final String query = "fn:unparsed-text-available('" + textUri + "')"; try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQueryContext context = new XQueryContext(pool); - context.addDynamicallyAvailableTextResource(textUri, UTF_8, (broker2, transaction, uri, charset) -> new InputStreamReader(new ByteArrayInputStream(text.getBytes(UTF_8)), charset)); - final XQuery xqueryService = pool.getXQueryService(); - final CompiledXQuery compiled = xqueryService.compile(context, query); - final Sequence result = xqueryService.execute(broker, compiled, null); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.addDynamicallyAvailableTextResource(textUri, UTF_8, (broker2, transaction, uri, charset) -> new InputStreamReader(new ByteArrayInputStream(text.getBytes(UTF_8)), charset)); + }; + + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); + final Sequence result = queryResult.result; assertFalse(result.isEmpty()); assertEquals(1, result.getItemCount()); @@ -127,7 +159,7 @@ public void unparsedTextAvailable_dynamicallyAvailableDocument_absoluteUri() thr } @Test - public void unparsedTextAvailable_dynamicallyAvailableDocument_relativeUri() throws XPathException, EXistException, PermissionDeniedException, URISyntaxException { + public void unparsedTextAvailable_dynamicallyAvailableDocument_relativeUri() throws XPathException, EXistException, PermissionDeniedException, IOException { final BrokerPool pool = BrokerPool.getInstance(); final String text = "hello, the time is: " + System.currentTimeMillis(); @@ -136,13 +168,18 @@ public void unparsedTextAvailable_dynamicallyAvailableDocument_relativeUri() thr final String query = "fn:unparsed-text-available('" + textRelativeUri + "')"; try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQueryContext context = new XQueryContext(pool); - context.setBaseURI(new AnyURIValue(new URI(baseUri))); - context.addDynamicallyAvailableTextResource(baseUri + textRelativeUri, UTF_8, (broker2, transaction, uri, charset) -> new InputStreamReader(new ByteArrayInputStream(text.getBytes(UTF_8)), charset)); - final XQuery xqueryService = pool.getXQueryService(); - final CompiledXQuery compiled = xqueryService.compile(context, query); - final Sequence result = xqueryService.execute(broker, compiled, null); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + try { + xqueryContext.setBaseURI(new AnyURIValue(new URI(baseUri))); + xqueryContext.addDynamicallyAvailableTextResource(baseUri + textRelativeUri, UTF_8, (broker2, transaction, uri, charset) -> new InputStreamReader(new ByteArrayInputStream(text.getBytes(UTF_8)), charset)); + } catch (final URISyntaxException e) { + throw new XPathException(e); + } + }; + + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); + final Sequence result = queryResult.result; assertFalse(result.isEmpty()); assertEquals(1, result.getItemCount()); @@ -151,7 +188,7 @@ public void unparsedTextAvailable_dynamicallyAvailableDocument_relativeUri() thr } @Test(expected = XPathException.class) - public void unparsedTextLines_noDataStream() throws XPathException, EXistException, PermissionDeniedException { + public void unparsedTextLines_noDataStream() throws XPathException, EXistException, PermissionDeniedException, IOException { final BrokerPool pool = BrokerPool.getInstance(); final String text = "hello, the time is: " + System.currentTimeMillis(); @@ -159,13 +196,12 @@ public void unparsedTextLines_noDataStream() throws XPathException, EXistExcepti final String query = "fn:unparsed-text-lines('" + textUri + "')"; try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQueryContext context = new XQueryContext(pool); - context.addDynamicallyAvailableTextResource(textUri, UTF_8, - (broker2, transaction, uri, charset) -> new InputStreamReader(null, charset)); + final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { + xqueryContext.addDynamicallyAvailableTextResource(textUri, UTF_8, (broker2, transaction, uri, charset) -> new InputStreamReader(null, charset)); + }; - final XQuery xqueryService = pool.getXQueryService(); - final CompiledXQuery compiled = xqueryService.compile(context, query); - final Sequence result = xqueryService.execute(broker, compiled, null); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); + final Sequence result = queryResult.result; } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/transform/FunTransformITTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/transform/FunTransformITTest.java index 1ca74a5b9e..1486946e58 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/transform/FunTransformITTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/transform/FunTransformITTest.java @@ -24,6 +24,7 @@ import org.exist.EXistException; import org.exist.collections.Collection; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.lock.ManagedCollectionLock; @@ -33,7 +34,7 @@ import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -144,13 +145,13 @@ public class FunTransformITTest { public static ExistEmbeddedServer existEmbeddedServer = new ExistEmbeddedServer(true, true); @Test - public void identityPersistentDom() throws XPathException, PermissionDeniedException, EXistException { + public void identityPersistentDom() throws XPathException, PermissionDeniedException, EXistException, IOException { final Source expected = Input.fromString(IDENTITY_XML).build(); expectQuery(IDENTITY_PERSISTENT_XSLT_QUERY, expected); } @Test - public void identityMemoryDom() throws XPathException, PermissionDeniedException, EXistException { + public void identityMemoryDom() throws XPathException, PermissionDeniedException, EXistException, IOException { final Source expected = Input.fromString(IDENTITY_XML).build(); expectQuery(IDENTITY_MEMORY_XSLT_QUERY, expected); } @@ -159,7 +160,7 @@ public void identityMemoryDom() throws XPathException, PermissionDeniedException * {@see https://github.com/eXist-db/exist/issues/5682} */ @Test - public void identityMixedMemoryAndPersistentDom() throws XPathException, PermissionDeniedException, EXistException { + public void identityMixedMemoryAndPersistentDom() throws XPathException, PermissionDeniedException, EXistException, IOException { // Document reference Source expected = Input.fromString("" + IDENTITY_XML + "").build(); expectQuery(IDENTITY_MIXED_XSLT_QUERY_1, expected); @@ -181,11 +182,10 @@ public void identityMixedMemoryAndPersistentDom() throws XPathException, Permiss expectQuery(IDENTITY_MIXED_XSLT_QUERY_5, expected); } - private static void expectQuery(final String query, final Source expected) throws EXistException, XPathException, PermissionDeniedException { + private static void expectQuery(final String query, final Source expected) throws EXistException, XPathException, PermissionDeniedException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence sequence = xquery.execute(broker, query, null); + final Sequence sequence = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(sequence); assertTrue(sequence.hasOne()); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/inspect/InspectModuleTest.java b/exist-core/src/test/java/org/exist/xquery/functions/inspect/InspectModuleTest.java index 1289483512..f1d0f42855 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/inspect/InspectModuleTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/inspect/InspectModuleTest.java @@ -50,6 +50,7 @@ import org.exist.collections.triggers.TriggerException; import org.exist.dom.memtree.ElementImpl; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.lock.Lock; @@ -59,7 +60,7 @@ import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Item; import org.exist.xquery.value.Sequence; import org.junit.*; @@ -129,10 +130,9 @@ public class InspectModuleTest { @Ignore("https://github.com/eXist-db/exist/issues/1386") @Test - public void xqDoc_withAtSignInline() throws PermissionDeniedException, XPathException, EXistException { + public void xqDoc_withAtSignInline() throws PermissionDeniedException, XPathException, EXistException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = pool.getTransactionManager().beginTransaction()) { final String query = @@ -140,7 +140,7 @@ public void xqDoc_withAtSignInline() throws PermissionDeniedException, XPathExce "inspect:inspect-module(xs:anyURI(\"xmldb:exist://" + TEST_COLLECTION.append(TEST_MODULE).toCollectionPathURI() + "\"))\n" + "/function[@name eq \"x:fun1\"]"; - final Sequence result = xqueryService.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(result); assertEquals(1, result.getItemCount()); @@ -165,10 +165,9 @@ public void xqDoc_withAtSignInline() throws PermissionDeniedException, XPathExce } @Test - public void xqDoc_withParamsAndReturn() throws PermissionDeniedException, XPathException, EXistException { + public void xqDoc_withParamsAndReturn() throws PermissionDeniedException, XPathException, EXistException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + try( final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = pool.getTransactionManager().beginTransaction()) { final String query = @@ -176,7 +175,7 @@ public void xqDoc_withParamsAndReturn() throws PermissionDeniedException, XPathE "inspect:inspect-module(xs:anyURI(\"xmldb:exist://" + TEST_COLLECTION.append(TEST_MODULE).toCollectionPathURI() + "\"))\n" + "/function[@name eq \"x:fun2\"]"; - final Sequence result = xqueryService.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(result); assertEquals(1, result.getItemCount()); @@ -203,9 +202,8 @@ public void xqDoc_withParamsAndReturn() throws PermissionDeniedException, XPathE } @Test - public void xqDoc_multilineDesciption() throws PermissionDeniedException, XPathException, EXistException { + public void xqDoc_multilineDesciption() throws PermissionDeniedException, XPathException, EXistException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = pool.getTransactionManager().beginTransaction()) { @@ -214,7 +212,7 @@ public void xqDoc_multilineDesciption() throws PermissionDeniedException, XPathE "inspect:inspect-module(xs:anyURI(\"xmldb:exist://" + TEST_COLLECTION.append(TEST_MODULE).toCollectionPathURI() + "\"))\n" + "/function[@name eq \"x:fun3\"]"; - final Sequence result = xqueryService.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(result); assertEquals(1, result.getItemCount()); @@ -239,9 +237,8 @@ public void xqDoc_multilineDesciption() throws PermissionDeniedException, XPathE } @Test - public void xqDoc_onAnnotatedFunction() throws PermissionDeniedException, XPathException, EXistException { + public void xqDoc_onAnnotatedFunction() throws PermissionDeniedException, XPathException, EXistException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = pool.getTransactionManager().beginTransaction()) { @@ -250,7 +247,7 @@ public void xqDoc_onAnnotatedFunction() throws PermissionDeniedException, XPathE "inspect:inspect-module(xs:anyURI(\"xmldb:exist://" + TEST_COLLECTION.append(TEST_MODULE).toCollectionPathURI() + "\"))\n" + "/function[@name eq \"x:fun4\"]"; - final Sequence result = xqueryService.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(result); assertEquals(1, result.getItemCount()); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/AccountManagementFunctionRemoveAccountTest.java b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/AccountManagementFunctionRemoveAccountTest.java index b48c587d34..8c8adce44c 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/AccountManagementFunctionRemoveAccountTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/AccountManagementFunctionRemoveAccountTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -21,22 +45,24 @@ */ package org.exist.xquery.functions.securitymanager; -import com.evolvedbinary.j8fu.function.Runnable3E; +import com.evolvedbinary.j8fu.function.Runnable4E; import org.exist.EXistException; import org.exist.TestUtils; import org.exist.security.AuthenticationException; import org.exist.security.PermissionDeniedException; import org.exist.security.SecurityManager; import org.exist.security.Subject; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.test.ExistEmbeddedServer; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.Rule; import org.junit.Test; +import java.io.IOException; import java.util.Optional; public class AccountManagementFunctionRemoveAccountTest { @@ -45,34 +71,34 @@ public class AccountManagementFunctionRemoveAccountTest { public final ExistEmbeddedServer existWebServer = new ExistEmbeddedServer(true, true); @Test(expected = PermissionDeniedException.class) - public void cannotDeleteSystemAccount() throws XPathException, PermissionDeniedException, EXistException, AuthenticationException { + public void cannotDeleteSystemAccount() throws XPathException, PermissionDeniedException, EXistException, AuthenticationException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject admin = pool.getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); extractPermissionDenied(() -> xqueryRemoveAccount(SecurityManager.SYSTEM, Optional.of(admin))); } @Test(expected = PermissionDeniedException.class) - public void cannotDeleteDbaAccount() throws XPathException, PermissionDeniedException, EXistException { + public void cannotDeleteDbaAccount() throws XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDenied(() -> xqueryRemoveAccount(SecurityManager.DBA_USER)); } @Test(expected = PermissionDeniedException.class) - public void cannotDeleteGuestAccount() throws XPathException, PermissionDeniedException, EXistException { + public void cannotDeleteGuestAccount() throws XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDenied(() -> xqueryRemoveAccount(SecurityManager.GUEST_USER)); } @Test(expected = PermissionDeniedException.class) - public void cannotDeleteUnknownAccount() throws XPathException, PermissionDeniedException, EXistException { + public void cannotDeleteUnknownAccount() throws XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDenied(() -> xqueryRemoveAccount(SecurityManager.UNKNOWN_USER)); } - private Sequence xqueryRemoveAccount(final String username) throws XPathException, PermissionDeniedException, EXistException { + private Sequence xqueryRemoveAccount(final String username) throws XPathException, PermissionDeniedException, EXistException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Optional asUser = Optional.of(pool.getSecurityManager().getSystemSubject()); return xqueryRemoveAccount(username, asUser); } - private Sequence xqueryRemoveAccount(final String username, final Optional asUser) throws EXistException, PermissionDeniedException, XPathException { + private Sequence xqueryRemoveAccount(final String username, final Optional asUser) throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final String query = @@ -80,13 +106,11 @@ private Sequence xqueryRemoveAccount(final String username, final Optional runnable) throws XPathException, PermissionDeniedException, EXistException { + private static void extractPermissionDenied(final Runnable4E runnable) throws XPathException, PermissionDeniedException, EXistException, IOException { try { runnable.run(); } catch (final XPathException e) { diff --git a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/AccountMetadataFunctionsTest.java b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/AccountMetadataFunctionsTest.java index be488512e6..7464aefa7d 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/AccountMetadataFunctionsTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/AccountMetadataFunctionsTest.java @@ -26,6 +26,7 @@ import org.exist.security.PermissionDeniedException; import org.exist.security.SecurityManager; import org.exist.security.internal.RealmImpl; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.txn.Txn; @@ -34,7 +35,7 @@ import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.Rule; import org.junit.Test; @@ -66,7 +67,7 @@ public class AccountMetadataFunctionsTest { * See: [BUG] Security Account Metadata is lost */ @Test - public void getAccountNameMetadataViaObject() throws PermissionDeniedException, EXistException, XPathException { + public void getAccountNameMetadataViaObject() throws PermissionDeniedException, EXistException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final SecurityManager sm = pool.getSecurityManager(); @@ -83,8 +84,7 @@ public void getAccountNameMetadataViaObject() throws PermissionDeniedException, "sm:get-account-metadata('" + USER1_UID + "', xs:anyURI('http://axschema.org/namePerson'))"; try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = existWebServer.getBrokerPool().getXQueryService(); - final Sequence result = xquery.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(result); assertEquals(USER1_NAME, result.itemAt(0).getStringValue()); } @@ -135,8 +135,7 @@ public void getAccountNameMetadataViaDocument() throws PermissionDeniedException "sm:get-account-metadata('" + USER1_UID + "', xs:anyURI('http://axschema.org/namePerson'))"; try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = existWebServer.getBrokerPool().getXQueryService(); - final Sequence result = xquery.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(result); assertEquals(USER1_NAME, result.itemAt(0).getStringValue()); } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GetPermissionsTest.java b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GetPermissionsTest.java index fa797da9aa..b27b1c6e75 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GetPermissionsTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GetPermissionsTest.java @@ -49,11 +49,12 @@ import org.exist.dom.memtree.ElementImpl; import org.exist.security.PermissionDeniedException; import org.exist.security.internal.SecurityManagerImpl; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.test.ExistEmbeddedServer; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.ClassRule; import org.junit.Test; @@ -63,6 +64,8 @@ import javax.xml.transform.Source; +import java.io.IOException; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -78,14 +81,13 @@ public class GetPermissionsTest { * See https://github.com/eXist-db/exist/issues/3231 */ @Test - public void getPermissionsNestedXml() throws EXistException, PermissionDeniedException, XPathException { + public void getPermissionsNestedXml() throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = ""; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.getBroker()) { - final XQuery xquery = existEmbeddedServer.getBrokerPool().getXQueryService(); - final Sequence result = xquery.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, result.getItemCount()); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupManagementFunctionRemoveGroupTest.java b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupManagementFunctionRemoveGroupTest.java index 7fef98cc6d..a280cac0d4 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupManagementFunctionRemoveGroupTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupManagementFunctionRemoveGroupTest.java @@ -55,6 +55,7 @@ import org.exist.xquery.XPathException; import org.junit.*; +import java.io.IOException; import java.util.Optional; import static org.exist.xquery.functions.securitymanager.SecurityManagerTestUtil.*; @@ -74,21 +75,21 @@ public class GroupManagementFunctionRemoveGroupTest { public final ExistEmbeddedServer existWebServer = new ExistEmbeddedServer(true, true); @Test(expected = PermissionDeniedException.class) - public void cannotDeleteDbaGroup() throws XPathException, PermissionDeniedException, EXistException { + public void cannotDeleteDbaGroup() throws XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDenied(() -> { xqueryRemoveGroup(existWebServer.getBrokerPool(), SecurityManager.DBA_GROUP); }); } @Test(expected = PermissionDeniedException.class) - public void cannotDeleteGuestGroup() throws XPathException, PermissionDeniedException, EXistException { + public void cannotDeleteGuestGroup() throws XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDenied(() -> { xqueryRemoveGroup(existWebServer.getBrokerPool(), SecurityManager.GUEST_GROUP); }); } @Test(expected = PermissionDeniedException.class) - public void cannotDeleteUnknownGroup() throws XPathException, PermissionDeniedException, EXistException { + public void cannotDeleteUnknownGroup() throws XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDenied(() -> { xqueryRemoveGroup(existWebServer.getBrokerPool(), SecurityManager.UNKNOWN_GROUP); }); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupMembershipFunctionRemoveGroupMemberTest.java b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupMembershipFunctionRemoveGroupMemberTest.java index b48574731c..1eafce23f3 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupMembershipFunctionRemoveGroupMemberTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupMembershipFunctionRemoveGroupMemberTest.java @@ -58,6 +58,7 @@ import org.junit.Rule; import org.junit.Test; +import java.io.IOException; import java.util.Optional; import static org.exist.xquery.functions.securitymanager.SecurityManagerTestUtil.*; @@ -75,7 +76,7 @@ public class GroupMembershipFunctionRemoveGroupMemberTest { public final ExistEmbeddedServer existWebServer = new ExistEmbeddedServer(true, true); @Test(expected = PermissionDeniedException.class) - public void cannotRemoveAllGroupsFromUserAsOwner() throws XPathException, PermissionDeniedException, EXistException, AuthenticationException { + public void cannotRemoveAllGroupsFromUserAsOwner() throws XPathException, PermissionDeniedException, EXistException, AuthenticationException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject owner = pool.getSecurityManager().authenticate(USER1_NAME, USER1_NAME); extractPermissionDenied(() -> { @@ -86,7 +87,7 @@ public void cannotRemoveAllGroupsFromUserAsOwner() throws XPathException, Permis } @Test(expected = PermissionDeniedException.class) - public void cannotRemoveAllGroupsFromUserAsDBA() throws XPathException, PermissionDeniedException, EXistException, AuthenticationException { + public void cannotRemoveAllGroupsFromUserAsDBA() throws XPathException, PermissionDeniedException, EXistException, AuthenticationException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject admin = pool.getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); extractPermissionDenied(() -> { @@ -97,7 +98,7 @@ public void cannotRemoveAllGroupsFromUserAsDBA() throws XPathException, Permissi } @Before - public void setup() throws EXistException, PermissionDeniedException, XPathException { + public void setup() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final SecurityManager sm = pool.getSecurityManager(); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/PermissionsFunctionChmodTest.java b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/PermissionsFunctionChmodTest.java index 0b14407cfa..bc34184c7e 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/PermissionsFunctionChmodTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/PermissionsFunctionChmodTest.java @@ -97,35 +97,35 @@ public class PermissionsFunctionChmodTest { public static final ExistEmbeddedServer existWebServer = new ExistEmbeddedServer(true, true); @Test - public void changeDocumentModeAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentModeAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject adminUser = pool.getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); xqueryChangeMode(pool, adminUser, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), RWXRWXRWX); } @Test - public void changeCollectionModeAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionModeAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject adminUser = pool.getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); xqueryChangeMode(pool, adminUser, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), RWXRWXRWX); } @Test - public void changeDocumentModeAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentModeAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().authenticate(USER1_NAME, USER1_PWD); xqueryChangeMode(pool, user1, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), RWXRWXRWX); } @Test - public void changeCollectionModeAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionModeAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().authenticate(USER1_NAME, USER1_PWD); xqueryChangeMode(pool, user1, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), RWXRWXRWX); } @Test(expected=PermissionDeniedException.class) - public void changeDocumentModeAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentModeAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user2 = pool.getSecurityManager().authenticate(USER2_NAME, USER2_PWD); extractPermissionDenied(() -> @@ -134,7 +134,7 @@ public void changeDocumentModeAsNonOwner() throws AuthenticationException, XPath } @Test(expected=PermissionDeniedException.class) - public void changeCollectionModeAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionModeAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user2 = pool.getSecurityManager().authenticate(USER2_NAME, USER2_PWD); extractPermissionDenied(() -> @@ -143,7 +143,7 @@ public void changeCollectionModeAsNonOwner() throws AuthenticationException, XPa } @Test - public void changeDocumentModeAsDBA_preservesSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeDocumentModeAsDBA_preservesSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject adminUser = pool.getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); @@ -158,7 +158,7 @@ public void changeDocumentModeAsDBA_preservesSetGid() throws AuthenticationExcep } @Test - public void changeCollectionModeAsDBA_preservesSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeCollectionModeAsDBA_preservesSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject adminUser = pool.getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); @@ -173,7 +173,7 @@ public void changeCollectionModeAsDBA_preservesSetGid() throws AuthenticationExc } @Test - public void changeDocumentModeAsNonDBAOwner_preservesSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeDocumentModeAsNonDBAOwner_preservesSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().authenticate(USER1_NAME, USER1_PWD); @@ -188,7 +188,7 @@ public void changeDocumentModeAsNonDBAOwner_preservesSetGid() throws Authenticat } @Test - public void changeCollectionModeAsNonDBAOwner_preservesSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeCollectionModeAsNonDBAOwner_preservesSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().authenticate(USER1_NAME, USER1_PWD); @@ -203,7 +203,7 @@ public void changeCollectionModeAsNonDBAOwner_preservesSetGid() throws Authentic } @Test(expected=PermissionDeniedException.class) - public void changeDocumentModeAsNonOwner_clearsSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeDocumentModeAsNonOwner_clearsSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user2 = pool.getSecurityManager().authenticate(USER2_NAME, USER2_PWD); @@ -220,7 +220,7 @@ public void changeDocumentModeAsNonOwner_clearsSetGid() throws AuthenticationExc } @Test(expected=PermissionDeniedException.class) - public void changeCollectionModeAsNonOwner_clearsSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeCollectionModeAsNonOwner_clearsSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user2 = pool.getSecurityManager().authenticate(USER2_NAME, USER2_PWD); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/PermissionsFunctionChownTest.java b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/PermissionsFunctionChownTest.java index 5401e3a29e..edccdec185 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/PermissionsFunctionChownTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/PermissionsFunctionChownTest.java @@ -55,6 +55,7 @@ import org.exist.security.*; import org.exist.security.SecurityManager; import org.exist.security.internal.aider.GroupAider; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.lock.Lock; @@ -66,7 +67,7 @@ import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.*; import org.xml.sax.SAXException; @@ -112,7 +113,7 @@ public class PermissionsFunctionChownTest { * as a DBA user change the owner of {@link #USER1_DOC1} from "user1" to "user1". */ @Test - public void changeDocumentOwnerToSelfAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToSelfAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER1_NAME); } @@ -122,7 +123,7 @@ public void changeDocumentOwnerToSelfAsDBA_restricted() throws AuthenticationExc * as a DBA user change the owner of {@link #USER1_DOC1} from "user1" to "user1". */ @Test - public void changeDocumentOwnerToSelfAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToSelfAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER1_NAME); } @@ -132,7 +133,7 @@ public void changeDocumentOwnerToSelfAsDBA() throws AuthenticationException, XPa * as a DBA user change the owner of {@link #USER1_COL1} from "user1" to "user1". */ @Test - public void changeCollectionOwnerToSelfAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToSelfAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER1_NAME); } @@ -142,7 +143,7 @@ public void changeCollectionOwnerToSelfAsDBA_restricted() throws AuthenticationE * as a DBA user change the owner of {@link #USER1_COL1} from "user1" to "user1". */ @Test - public void changeCollectionOwnerToSelfAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToSelfAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER1_NAME); } @@ -152,7 +153,7 @@ public void changeCollectionOwnerToSelfAsDBA() throws AuthenticationException, X * as the document owner user change the owner of {@link #USER1_DOC1} from "user1" to "user1". */ @Test - public void changeDocumentOwnerToSelfAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToSelfAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER1_NAME); } @@ -162,7 +163,7 @@ public void changeDocumentOwnerToSelfAsNonDBAOwner_restricted() throws Authentic * as the document owner user change the owner of {@link #USER1_DOC1} from "user1" to "user1". */ @Test - public void changeDocumentOwnerToSelfAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToSelfAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER1_NAME); } @@ -172,7 +173,7 @@ public void changeDocumentOwnerToSelfAsNonDBAOwner() throws AuthenticationExcept * as the collection owner user change the owner of {@link #USER1_COL1} from "user1" to "user1". */ @Test - public void changeCollectionOwnerToSelfAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToSelfAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER1_NAME); } @@ -182,7 +183,7 @@ public void changeCollectionOwnerToSelfAsNonDBAOwner_restricted() throws Authent * as the collection owner user change the owner of {@link #USER1_COL1} from "user1" to "user1". */ @Test - public void changeCollectionOwnerToSelfAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToSelfAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER1_NAME); } @@ -192,7 +193,7 @@ public void changeCollectionOwnerToSelfAsNonDBAOwner() throws AuthenticationExce * as the user "user2" (not the document's owner) change the owner of {@link #USER1_DOC1} from "user1" to "user1". */ @Test - public void changeDocumentOwnerToSelfAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToSelfAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER1_NAME); } @@ -202,7 +203,7 @@ public void changeDocumentOwnerToSelfAsNonOwner_restricted() throws Authenticati * as the user "user2" (not the document's owner) change the owner of {@link #USER1_DOC1} from "user1" to "user1". */ @Test - public void changeDocumentOwnerToSelfAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToSelfAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER1_NAME); } @@ -212,7 +213,7 @@ public void changeDocumentOwnerToSelfAsNonOwner() throws AuthenticationException * as the user "user2" (not the collection's owner) change the owner of {@link #USER1_COL1} from "user1" to "user1". */ @Test - public void changeCollectionOwnerToSelfAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToSelfAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER1_NAME); } @@ -222,7 +223,7 @@ public void changeCollectionOwnerToSelfAsNonOwner_restricted() throws Authentica * as the user "user2" (not the collection's owner) change the owner of {@link #USER1_COL1} from "user1" to "user1". */ @Test - public void changeCollectionOwnerToSelfAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToSelfAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER1_NAME); } @@ -232,7 +233,7 @@ public void changeCollectionOwnerToSelfAsNonOwner() throws AuthenticationExcepti * as a DBA user change the owner of {@link #USER1_DOC1} from "user1" to "user2". */ @Test - public void changeDocumentOwnerAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER2_NAME); } @@ -242,7 +243,7 @@ public void changeDocumentOwnerAsDBA_restricted() throws AuthenticationException * as a DBA user change the owner of {@link #USER1_DOC1} from "user1" to "user2". */ @Test - public void changeDocumentOwnerAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER2_NAME); } @@ -252,7 +253,7 @@ public void changeDocumentOwnerAsDBA() throws AuthenticationException, XPathExce * as a DBA user change the owner of {@link #USER1_COL1} from "user1" to "user2". */ @Test - public void changeCollectionOwnerAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER2_NAME); } @@ -262,7 +263,7 @@ public void changeCollectionOwnerAsDBA_restricted() throws AuthenticationExcepti * as a DBA user change the owner of {@link #USER1_COL1} from "user1" to "user2". */ @Test - public void changeCollectionOwnerAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER2_NAME); } @@ -272,7 +273,7 @@ public void changeCollectionOwnerAsDBA() throws AuthenticationException, XPathEx * as the document owner user change the owner of {@link #USER1_DOC1} from "user1" to "user2". */ @Test(expected=PermissionDeniedException.class) - public void changeDocumentOwnerAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER2_NAME); @@ -284,7 +285,7 @@ public void changeDocumentOwnerAsNonDBAOwner_restricted() throws AuthenticationE * as the document owner user change the owner of {@link #USER1_DOC1} from "user1" to "user2". */ @Test - public void changeDocumentOwnerAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER2_NAME); } @@ -294,7 +295,7 @@ public void changeDocumentOwnerAsNonDBAOwner() throws AuthenticationException, X * as the collection owner user change the owner of {@link #USER1_COL1} from "user1" to "user2". */ @Test(expected=PermissionDeniedException.class) - public void changeCollectionOwnerAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER2_NAME); @@ -306,7 +307,7 @@ public void changeCollectionOwnerAsNonDBAOwner_restricted() throws Authenticatio * as the collection owner user change the owner of {@link #USER1_COL1} from "user1" to "user2". */ @Test - public void changeCollectionOwnerAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER2_NAME); } @@ -316,7 +317,7 @@ public void changeCollectionOwnerAsNonDBAOwner() throws AuthenticationException, * as the user "user2" (not the document's owner) change the owner of {@link #USER1_DOC1} from "user1" to "user2". */ @Test(expected=PermissionDeniedException.class) - public void changeDocumentOwnerAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER2_NAME); @@ -328,7 +329,7 @@ public void changeDocumentOwnerAsNonOwner_restricted() throws AuthenticationExce * as the user "user2" (not the document's owner) change the owner of {@link #USER1_DOC1} from "user1" to "user2". */ @Test(expected=PermissionDeniedException.class) - public void changeDocumentOwnerAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER2_NAME); @@ -340,7 +341,7 @@ public void changeDocumentOwnerAsNonOwner() throws AuthenticationException, XPat * as the user "user2" (not the collection's owner) change the owner of {@link #USER1_COL1} from "user1" to "user2". */ @Test(expected=PermissionDeniedException.class) - public void changeCollectionOwnerAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER2_NAME); @@ -352,7 +353,7 @@ public void changeCollectionOwnerAsNonOwner_restricted() throws AuthenticationEx * as the user "user2" (not the collection's owner) change the owner of {@link #USER1_COL1} from "user1" to "user2". */ @Test(expected=PermissionDeniedException.class) - public void changeCollectionOwnerAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER2_NAME); @@ -365,7 +366,7 @@ public void changeCollectionOwnerAsNonOwner() throws AuthenticationException, XP * Finally make sure that chown has cleared the setUid and setGid bits. */ @Test - public void changeDocumentOwnerToSelfAsNonDBAOwner_clearsSetUidAndSetGid_restricted() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeDocumentOwnerToSelfAsNonDBAOwner_clearsSetUidAndSetGid_restricted() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().authenticate(USER1_NAME, USER1_PWD); @@ -385,7 +386,7 @@ public void changeDocumentOwnerToSelfAsNonDBAOwner_clearsSetUidAndSetGid_restric * Finally make sure that chown has cleared the setUid and setGid bits. */ @Test - public void changeDocumentOwnerToSelfAsNonDBAOwner_clearsSetUidAndSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeDocumentOwnerToSelfAsNonDBAOwner_clearsSetUidAndSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().authenticate(USER1_NAME, USER1_PWD); @@ -405,7 +406,7 @@ public void changeDocumentOwnerToSelfAsNonDBAOwner_clearsSetUidAndSetGid() throw * Finally make sure that chown has cleared the setUid and setGid bits. */ @Test - public void changeCollectionOwnerToSelfAsNonDBAOwner_clearsSetUidAndSetGid_restricted() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeCollectionOwnerToSelfAsNonDBAOwner_clearsSetUidAndSetGid_restricted() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().authenticate(USER1_NAME, USER1_PWD); @@ -425,7 +426,7 @@ public void changeCollectionOwnerToSelfAsNonDBAOwner_clearsSetUidAndSetGid_restr * Finally make sure that chown has cleared the setUid and setGid bits. */ @Test - public void changeCollectionOwnerToSelfAsNonDBAOwner_clearsSetUidAndSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeCollectionOwnerToSelfAsNonDBAOwner_clearsSetUidAndSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().authenticate(USER1_NAME, USER1_PWD); @@ -445,7 +446,7 @@ public void changeCollectionOwnerToSelfAsNonDBAOwner_clearsSetUidAndSetGid() thr * Finally make sure that chown has preserved the setUid and setGid bits. */ @Test - public void changeDocumentOwnerToSelfAsDBA_preservesSetUidAndSetGid_restricted() throws EXistException, PermissionDeniedException, XPathException { + public void changeDocumentOwnerToSelfAsDBA_preservesSetUidAndSetGid_restricted() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().getSystemSubject(); @@ -465,7 +466,7 @@ public void changeDocumentOwnerToSelfAsDBA_preservesSetUidAndSetGid_restricted() * Finally make sure that chown has preserved the setUid and setGid bits. */ @Test - public void changeDocumentOwnerToSelfAsDBA_preservesSetUidAndSetGid() throws EXistException, PermissionDeniedException, XPathException { + public void changeDocumentOwnerToSelfAsDBA_preservesSetUidAndSetGid() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().getSystemSubject(); @@ -485,7 +486,7 @@ public void changeDocumentOwnerToSelfAsDBA_preservesSetUidAndSetGid() throws EXi * Finally make sure that chown has preserved the setUid and setGid bits. */ @Test - public void changeCollectionOwnerToSelfAsDBA_preservesSetUidAndSetGid_restricted() throws EXistException, PermissionDeniedException, XPathException { + public void changeCollectionOwnerToSelfAsDBA_preservesSetUidAndSetGid_restricted() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().getSystemSubject(); @@ -505,7 +506,7 @@ public void changeCollectionOwnerToSelfAsDBA_preservesSetUidAndSetGid_restricted * Finally make sure that chown has preserved the setUid and setGid bits. */ @Test - public void changeCollectionOwnerToSelfAsDBA_preservesSetUidAndSetGid() throws EXistException, PermissionDeniedException, XPathException { + public void changeCollectionOwnerToSelfAsDBA_preservesSetUidAndSetGid() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().getSystemSubject(); @@ -524,7 +525,7 @@ public void changeCollectionOwnerToSelfAsDBA_preservesSetUidAndSetGid() throws E * as a DBA user change the group of {@link #USER1_DOC1} from "user1" to "user1". */ @Test - public void changeDocumentGroupToSelfAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToSelfAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER1_NAME); } @@ -534,7 +535,7 @@ public void changeDocumentGroupToSelfAsDBA_restricted() throws AuthenticationExc * as a DBA user change the group of {@link #USER1_DOC1} from "user1" to "user1". */ @Test - public void changeDocumentGroupToSelfAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToSelfAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER1_NAME); } @@ -544,7 +545,7 @@ public void changeDocumentGroupToSelfAsDBA() throws AuthenticationException, XPa * as a DBA user change the group of {@link #USER1_COL1} from "user1" to "user1". */ @Test - public void changeCollectionGroupToSelfAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToSelfAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER1_NAME); } @@ -554,7 +555,7 @@ public void changeCollectionGroupToSelfAsDBA_restricted() throws AuthenticationE * as a DBA user change the group of {@link #USER1_COL1} from "user1" to "user1". */ @Test - public void changeCollectionGroupToSelfAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToSelfAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER1_NAME); } @@ -564,7 +565,7 @@ public void changeCollectionGroupToSelfAsDBA() throws AuthenticationException, X * as the document owner user change the group of {@link #USER1_DOC1} from "user1" to "user1". */ @Test - public void changeDocumentGroupToSelfAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToSelfAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER1_NAME); } @@ -574,7 +575,7 @@ public void changeDocumentGroupToSelfAsNonDBAOwner_restricted() throws Authentic * as the document owner user change the group of {@link #USER1_DOC1} from "user1" to "user1". */ @Test - public void changeDocumentGroupToSelfAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToSelfAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER1_NAME); } @@ -584,7 +585,7 @@ public void changeDocumentGroupToSelfAsNonDBAOwner() throws AuthenticationExcept * as the collection owner user change the group of {@link #USER1_COL1} from "user1" to "user1". */ @Test - public void changeCollectionGroupToSelfAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToSelfAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER1_NAME); } @@ -594,7 +595,7 @@ public void changeCollectionGroupToSelfAsNonDBAOwner_restricted() throws Authent * as the collection owner user change the group of {@link #USER1_COL1} from "user1" to "user1". */ @Test - public void changeCollectionGroupToSelfAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToSelfAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER1_NAME); } @@ -604,7 +605,7 @@ public void changeCollectionGroupToSelfAsNonDBAOwner() throws AuthenticationExce * as the user "user2" (not the document's owner) change the group of {@link #USER1_DOC1} from "user1" to "user1". */ @Test - public void changeDocumentGroupToSelfAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToSelfAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER1_NAME); } @@ -614,7 +615,7 @@ public void changeDocumentGroupToSelfAsNonOwner_restricted() throws Authenticati * as the user "user2" (not the document's owner) change the group of {@link #USER1_DOC1} from "user1" to "user1". */ @Test - public void changeDocumentGroupToSelfAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToSelfAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER1_NAME); } @@ -624,7 +625,7 @@ public void changeDocumentGroupToSelfAsNonOwner() throws AuthenticationException * as the user "user2" (not the collection's owner) change the group of {@link #USER1_COL1} from "user1" to "user1". */ @Test - public void changeCollectionGroupToSelfAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToSelfAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER1_NAME); } @@ -634,7 +635,7 @@ public void changeCollectionGroupToSelfAsNonOwner_restricted() throws Authentica * as the user "user2" (not the collection's owner) change the group of {@link #USER1_COL1} from "user1" to "user1". */ @Test - public void changeCollectionGroupToSelfAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToSelfAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER1_NAME); } @@ -644,7 +645,7 @@ public void changeCollectionGroupToSelfAsNonOwner() throws AuthenticationExcepti * as a DBA user change the group of {@link #USER1_DOC1} from "user1" to "user2". */ @Test - public void changeDocumentGroupAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER2_NAME); } @@ -654,7 +655,7 @@ public void changeDocumentGroupAsDBA_restricted() throws AuthenticationException * as a DBA user change the group of {@link #USER1_DOC1} from "user1" to "user2". */ @Test - public void changeDocumentGroupAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER2_NAME); } @@ -664,7 +665,7 @@ public void changeDocumentGroupAsDBA() throws AuthenticationException, XPathExce * as a DBA user change the group of {@link #USER1_COL1} from "user1" to "user2". */ @Test - public void changeCollectionGroupAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER2_NAME); } @@ -674,7 +675,7 @@ public void changeCollectionGroupAsDBA_restricted() throws AuthenticationExcepti * as a DBA user change the group of {@link #USER1_COL1} from "user1" to "user2". */ @Test - public void changeCollectionGroupAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER2_NAME); } @@ -684,7 +685,7 @@ public void changeCollectionGroupAsDBA() throws AuthenticationException, XPathEx * as the document owner user change the group of {@link #USER1_DOC1} from "user1" to "user2". */ @Test(expected=PermissionDeniedException.class) - public void changeDocumentGroupAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER2_NAME); @@ -696,7 +697,7 @@ public void changeDocumentGroupAsNonDBAOwner_restricted() throws AuthenticationE * as the document owner user change the group of {@link #USER1_DOC1} from "user1" to "user2". */ @Test - public void changeDocumentGroupAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER2_NAME); } @@ -706,7 +707,7 @@ public void changeDocumentGroupAsNonDBAOwner() throws AuthenticationException, X * as the collection owner user change the group of {@link #USER1_COL1} from "user1" to "user2". */ @Test(expected=PermissionDeniedException.class) - public void changeCollectionGroupAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER2_NAME); @@ -718,7 +719,7 @@ public void changeCollectionGroupAsNonDBAOwner_restricted() throws Authenticatio * as the collection owner user change the group of {@link #USER1_COL1} from "user1" to "user2". */ @Test - public void changeCollectionGroupAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER2_NAME); } @@ -728,7 +729,7 @@ public void changeCollectionGroupAsNonDBAOwner() throws AuthenticationException, * as the user "user2" (not the document's owner) change the group of {@link #USER1_DOC1} from "user1" to "user2". */ @Test(expected=PermissionDeniedException.class) - public void changeDocumentGroupAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER2_NAME); @@ -740,7 +741,7 @@ public void changeDocumentGroupAsNonOwner_restricted() throws AuthenticationExce * as the user "user2" (not the document's owner) change the group of {@link #USER1_DOC1} from "user1" to "user2". */ @Test(expected=PermissionDeniedException.class) - public void changeDocumentGroupAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USER2_NAME); @@ -752,7 +753,7 @@ public void changeDocumentGroupAsNonOwner() throws AuthenticationException, XPat * as the user "user2" (not the collection's owner) change the group of {@link #USER1_COL1} from "user1" to "user2". */ @Test(expected=PermissionDeniedException.class) - public void changeCollectionGroupAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER2_NAME); @@ -764,7 +765,7 @@ public void changeCollectionGroupAsNonOwner_restricted() throws AuthenticationEx * as the user "user2" (not the collection's owner) change the group of {@link #USER1_COL1} from "user1" to "user2". */ @Test(expected=PermissionDeniedException.class) - public void changeCollectionGroupAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USER2_NAME); @@ -776,7 +777,7 @@ public void changeCollectionGroupAsNonOwner() throws AuthenticationException, XP * as the document owner user change the group of {@link #USER1_DOC1} from "user1" to "otherGroup" (of which user1 is a member). */ @Test - public void changeDocumentGroupToMemberGroupAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToMemberGroupAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), OTHER_GROUP_NAME); } @@ -786,7 +787,7 @@ public void changeDocumentGroupToMemberGroupAsNonDBAOwner_restricted() throws Au * as the document owner user change the group of {@link #USER1_DOC1} from "user1" to "otherGroup" (of which user1 is a member). */ @Test - public void changeDocumentGroupToMemberGroupAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToMemberGroupAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), OTHER_GROUP_NAME); } @@ -796,7 +797,7 @@ public void changeDocumentGroupToMemberGroupAsNonDBAOwner() throws Authenticatio * as the collection owner user change the group of {@link #USER1_COL1} from "user1" to "otherGroup" (of which user1 is a member). */ @Test - public void changeCollectionGroupToMemberGroupAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToMemberGroupAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), OTHER_GROUP_NAME); } @@ -806,7 +807,7 @@ public void changeCollectionGroupToMemberGroupAsNonDBAOwner_restricted() throws * as the collection owner user change the group of {@link #USER1_COL1} from "user1" to "otherGroup" (of which user1 is a member). */ @Test - public void changeCollectionGroupToMemberGroupAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToMemberGroupAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), OTHER_GROUP_NAME); } @@ -816,7 +817,7 @@ public void changeCollectionGroupToMemberGroupAsNonDBAOwner() throws Authenticat * as the user "user2" (not the document's owner) change the group of {@link #USER1_DOC1} from "user1" to "otherGroup" (of which user2 is a member). */ @Test(expected=PermissionDeniedException.class) - public void changeDocumentGroupToMemberGroupAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToMemberGroupAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), OTHER_GROUP_NAME); @@ -828,7 +829,7 @@ public void changeDocumentGroupToMemberGroupAsNonOwner_restricted() throws Authe * as the user "user2" (not the document's owner) change the group of {@link #USER1_DOC1} from "user1" to "otherGroup" (of which user2 is a member). */ @Test(expected=PermissionDeniedException.class) - public void changeDocumentGroupToMemberGroupAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToMemberGroupAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); extractPermissionDenied(() -> changeGroup(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), OTHER_GROUP_NAME) @@ -840,7 +841,7 @@ public void changeDocumentGroupToMemberGroupAsNonOwner() throws AuthenticationEx * as the user "user2" (not the collection's owner) change the group of {@link #USER1_COL1} from "user1" to "otherGroup" (of which user2 is a member). */ @Test(expected=PermissionDeniedException.class) - public void changeCollectionGroupToMemberGroupAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToMemberGroupAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), OTHER_GROUP_NAME); @@ -852,7 +853,7 @@ public void changeCollectionGroupToMemberGroupAsNonOwner_restricted() throws Aut * as the user "user2" (not the collection's owner) change the group of {@link #USER1_COL1} from "user1" to "otherGroup" (of which user2 is a member). */ @Test(expected=PermissionDeniedException.class) - public void changeCollectionGroupToMemberGroupAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToMemberGroupAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); extractPermissionDenied(() -> changeGroup(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), OTHER_GROUP_NAME) @@ -865,7 +866,7 @@ public void changeCollectionGroupToMemberGroupAsNonOwner() throws Authentication * Finally make sure that chown has cleared the setUid and setGid bits. */ @Test - public void changeDocumentGroupToSelfAsNonDBAOwner_clearsSetUidAndSetGid_restricted() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeDocumentGroupToSelfAsNonDBAOwner_clearsSetUidAndSetGid_restricted() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().authenticate(USER1_NAME, USER1_PWD); @@ -885,7 +886,7 @@ public void changeDocumentGroupToSelfAsNonDBAOwner_clearsSetUidAndSetGid_restric * Finally make sure that chown has cleared the setUid and setGid bits. */ @Test - public void changeDocumentGroupToSelfAsNonDBAOwner_clearsSetUidAndSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeDocumentGroupToSelfAsNonDBAOwner_clearsSetUidAndSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().authenticate(USER1_NAME, USER1_PWD); @@ -905,7 +906,7 @@ public void changeDocumentGroupToSelfAsNonDBAOwner_clearsSetUidAndSetGid() throw * Finally make sure that chown has cleared the setUid and setGid bits. */ @Test - public void changeCollectionGroupToSelfAsNonDBAOwner_clearsSetUidAndSetGid_restricted() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeCollectionGroupToSelfAsNonDBAOwner_clearsSetUidAndSetGid_restricted() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().authenticate(USER1_NAME, USER1_PWD); @@ -925,7 +926,7 @@ public void changeCollectionGroupToSelfAsNonDBAOwner_clearsSetUidAndSetGid_restr * Finally make sure that chown has cleared the setUid and setGid bits. */ @Test - public void changeCollectionGroupToSelfAsNonDBAOwner_clearsSetUidAndSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException { + public void changeCollectionGroupToSelfAsNonDBAOwner_clearsSetUidAndSetGid() throws AuthenticationException, EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().authenticate(USER1_NAME, USER1_PWD); @@ -945,7 +946,7 @@ public void changeCollectionGroupToSelfAsNonDBAOwner_clearsSetUidAndSetGid() thr * Finally make sure that chown has preserved the setUid and setGid bits. */ @Test - public void changeDocumentGroupToSelfAsDBA_preservesSetUidAndSetGid_restricted() throws EXistException, PermissionDeniedException, XPathException { + public void changeDocumentGroupToSelfAsDBA_preservesSetUidAndSetGid_restricted() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().getSystemSubject(); @@ -965,7 +966,7 @@ public void changeDocumentGroupToSelfAsDBA_preservesSetUidAndSetGid_restricted() * Finally make sure that chown has preserved the setUid and setGid bits. */ @Test - public void changeDocumentGroupToSelfAsDBA_preservesSetUidAndSetGid() throws EXistException, PermissionDeniedException, XPathException { + public void changeDocumentGroupToSelfAsDBA_preservesSetUidAndSetGid() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().getSystemSubject(); @@ -985,7 +986,7 @@ public void changeDocumentGroupToSelfAsDBA_preservesSetUidAndSetGid() throws EXi * Finally make sure that chown has preserved the setUid and setGid bits. */ @Test - public void changeCollectionGroupToSelfAsDBA_preservesSetUidAndSetGid_restricted() throws EXistException, PermissionDeniedException, XPathException { + public void changeCollectionGroupToSelfAsDBA_preservesSetUidAndSetGid_restricted() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().getSystemSubject(); @@ -1005,7 +1006,7 @@ public void changeCollectionGroupToSelfAsDBA_preservesSetUidAndSetGid_restricted * Finally make sure that chown has preserved the setUid and setGid bits. */ @Test - public void changeCollectionGroupToSelfAsDBA_preservesSetUidAndSetGid() throws EXistException, PermissionDeniedException, XPathException { + public void changeCollectionGroupToSelfAsDBA_preservesSetUidAndSetGid() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject user1 = pool.getSecurityManager().getSystemSubject(); @@ -1020,31 +1021,31 @@ public void changeCollectionGroupToSelfAsDBA_preservesSetUidAndSetGid() throws E } @Test - public void changeCollectionOwnerToNonExistentAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToNonExistentAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), "no-such-user", USER1_NAME); } @Test - public void changeCollectionOwnerToNonExistentAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToNonExistentAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), "no-such-user", USER1_NAME); } @Test - public void changeCollectionOwnerToRemovedUserAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToRemovedUserAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USERRM_NAME, USER1_NAME); } @Test - public void changeCollectionOwnerToRemovedUserAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToRemovedUserAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USERRM_NAME, USER1_NAME); } @Test - public void changeCollectionOwnerToNonExistentAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToNonExistentAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), "no-such-user", USER1_NAME); } @@ -1053,13 +1054,13 @@ public void changeCollectionOwnerToNonExistentAsNonDBAOwner() throws Authenticat * With {@code posix-chown-restricted="true"}, * as the collection owner user change the owner of {@link #USER1_COL1} from "user1" to "no-such-user". */ - public void changeCollectionOwnerToNonExistentAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToNonExistentAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), "no-such-user", USER1_NAME); } @Test - public void changeCollectionOwnerToRemovedUserAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToRemovedUserAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USERRM_NAME, USER1_NAME); } @@ -1069,7 +1070,7 @@ public void changeCollectionOwnerToRemovedUserAsNonDBAOwner() throws Authenticat * as the collection owner user change the owner of {@link #USER1_COL1} from "user1" to "userrm". */ @Test(expected=PermissionDeniedException.class) - public void changeCollectionOwnerToRemovedUserAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToRemovedUserAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USERRM_NAME, USER1_NAME); @@ -1077,7 +1078,7 @@ public void changeCollectionOwnerToRemovedUserAsNonDBAOwner_restricted() throws } @Test(expected=PermissionDeniedException.class) - public void changeCollectionOwnerToNonExistentAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToNonExistentAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), "no-such-user", USER1_NAME); @@ -1085,7 +1086,7 @@ public void changeCollectionOwnerToNonExistentAsNonOwner() throws Authentication } @Test(expected=PermissionDeniedException.class) - public void changeCollectionOwnerToNonExistentAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToNonExistentAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), "no-such-user", USER1_NAME); @@ -1093,7 +1094,7 @@ public void changeCollectionOwnerToNonExistentAsNonOwner_restricted() throws Aut } @Test(expected=PermissionDeniedException.class) - public void changeCollectionOwnerToRemovedUserAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToRemovedUserAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USERRM_NAME, USER1_NAME); @@ -1101,7 +1102,7 @@ public void changeCollectionOwnerToRemovedUserAsNonOwner() throws Authentication } @Test(expected=PermissionDeniedException.class) - public void changeCollectionOwnerToRemovedUserAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionOwnerToRemovedUserAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USERRM_NAME, USER1_NAME); @@ -1109,55 +1110,55 @@ public void changeCollectionOwnerToRemovedUserAsNonOwner_restricted() throws Aut } @Test - public void changeCollectionGroupToNonExistentAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToNonExistentAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), "no-such-group", USER1_NAME); } @Test - public void changeCollectionGroupToNonExistentAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToNonExistentAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), "no-such-group", USER1_NAME); } @Test - public void changeCollectionGroupToRemovedGroupAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToRemovedGroupAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USERRM_NAME, USER1_NAME); } @Test - public void changeCollectionGroupToRemovedGroupAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToRemovedGroupAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USERRM_NAME, USER1_NAME); } @Test - public void changeCollectionGroupToNonExistentAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToNonExistentAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), "no-such-group", USER1_NAME); } @Test - public void changeCollectionGroupToNonExistentAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToNonExistentAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), "no-such-group", USER1_NAME); } @Test - public void changeCollectionGroupToRemovedGroupAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToRemovedGroupAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USERRM_NAME, USER1_NAME); } @Test - public void changeCollectionGroupToRemovedGroupAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToRemovedGroupAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USERRM_NAME, USER1_NAME); } @Test(expected=PermissionDeniedException.class) - public void changeCollectionGroupToNonExistentAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToNonExistentAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), "no-such-group", USER1_NAME); @@ -1165,7 +1166,7 @@ public void changeCollectionGroupToNonExistentAsNonOwner() throws Authentication } @Test(expected=PermissionDeniedException.class) - public void changeCollectionGroupToNonExistentAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToNonExistentAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), "no-such-group", USER1_NAME); @@ -1173,7 +1174,7 @@ public void changeCollectionGroupToNonExistentAsNonOwner_restricted() throws Aut } @Test(expected=PermissionDeniedException.class) - public void changeCollectionGroupToRemovedGroupAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToRemovedGroupAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USERRM_NAME, USER1_NAME); @@ -1181,7 +1182,7 @@ public void changeCollectionGroupToRemovedGroupAsNonOwner() throws Authenticatio } @Test(expected=PermissionDeniedException.class) - public void changeCollectionGroupToRemovedGroupAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeCollectionGroupToRemovedGroupAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), USERRM_NAME, USER1_NAME); @@ -1189,31 +1190,31 @@ public void changeCollectionGroupToRemovedGroupAsNonOwner_restricted() throws Au } @Test - public void changeDocumentOwnerToNonExistentAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToNonExistentAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), "no-such-user", USER1_NAME); } @Test - public void changeDocumentOwnerToNonExistentAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToNonExistentAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), "no-such-user", USER1_NAME); } @Test - public void changeDocumentOwnerToRemovedUserAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToRemovedUserAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USERRM_NAME, USER1_NAME); } @Test - public void changeDocumentOwnerToRemovedUserAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToRemovedUserAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USERRM_NAME, USER1_NAME); } @Test - public void changeDocumentOwnerToNonExistentAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToNonExistentAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), "no-such-user", USER1_NAME); } @@ -1223,7 +1224,7 @@ public void changeDocumentOwnerToNonExistentAsNonDBAOwner() throws Authenticatio * as the document owner user change the owner of {@link #USER1_DOC1} from "user1" to "no-such-user". */ @Test(expected=PermissionDeniedException.class) - public void changeDocumentOwnerToNonExistentAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToNonExistentAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), "no-such-user", USER1_NAME); @@ -1231,7 +1232,7 @@ public void changeDocumentOwnerToNonExistentAsNonDBAOwner_restricted() throws Au } @Test - public void changeDocumentOwnerToRemovedUserAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToRemovedUserAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USERRM_NAME, USER1_NAME); } @@ -1241,7 +1242,7 @@ public void changeDocumentOwnerToRemovedUserAsNonDBAOwner() throws Authenticatio * as the document owner user change the owner of {@link #USER1_DOC1} from "user1" to "no-such-user". */ @Test(expected=PermissionDeniedException.class) - public void changeDocumentOwnerToRemovedUserAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToRemovedUserAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USERRM_NAME, USER1_NAME); @@ -1249,7 +1250,7 @@ public void changeDocumentOwnerToRemovedUserAsNonDBAOwner_restricted() throws Au } @Test(expected=PermissionDeniedException.class) - public void changeDocumentOwnerToNonExistentAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToNonExistentAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), "no-such-user", USER1_NAME); @@ -1257,7 +1258,7 @@ public void changeDocumentOwnerToNonExistentAsNonOwner() throws AuthenticationEx } @Test(expected=PermissionDeniedException.class) - public void changeDocumentOwnerToNonExistentAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToNonExistentAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), "no-such-user", USER1_NAME); @@ -1265,7 +1266,7 @@ public void changeDocumentOwnerToNonExistentAsNonOwner_restricted() throws Authe } @Test(expected=PermissionDeniedException.class) - public void changeDocumentOwnerToRemovedUserAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToRemovedUserAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USERRM_NAME, USER1_NAME); @@ -1273,7 +1274,7 @@ public void changeDocumentOwnerToRemovedUserAsNonOwner() throws AuthenticationEx } @Test(expected=PermissionDeniedException.class) - public void changeDocumentOwnerToRemovedUserAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentOwnerToRemovedUserAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USERRM_NAME, USER1_NAME); @@ -1281,55 +1282,55 @@ public void changeDocumentOwnerToRemovedUserAsNonOwner_restricted() throws Authe } @Test - public void changeDocumentGroupToNonExistentAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToNonExistentAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), "no-such-group", USER1_NAME); } @Test - public void changeDocumentGroupToNonExistentAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToNonExistentAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), "no-such-group", USER1_NAME); } @Test - public void changeDocumentGroupToRemovedGroupAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToRemovedGroupAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USERRM_NAME, USER1_NAME); } @Test - public void changeDocumentGroupToRemovedGroupAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToRemovedGroupAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeGroup(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USERRM_NAME, USER1_NAME); } @Test - public void changeDocumentGroupToNonExistentAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToNonExistentAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), "no-such-group", USER1_NAME); } @Test - public void changeDocumentGroupToNonExistentAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToNonExistentAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), "no-such-group", USER1_NAME); } @Test - public void changeDocumentGroupToRemovedGroupAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToRemovedGroupAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USERRM_NAME, USER1_NAME); } @Test - public void changeDocumentGroupToRemovedGroupAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToRemovedGroupAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeGroup(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USERRM_NAME, USER1_NAME); } @Test(expected=PermissionDeniedException.class) - public void changeDocumentGroupToNonExistentAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToNonExistentAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), "no-such-group", USER1_NAME); @@ -1337,7 +1338,7 @@ public void changeDocumentGroupToNonExistentAsNonOwner() throws AuthenticationEx } @Test(expected=PermissionDeniedException.class) - public void changeDocumentGroupToNonExistentAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToNonExistentAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), "no-such-group", USER1_NAME); @@ -1345,7 +1346,7 @@ public void changeDocumentGroupToNonExistentAsNonOwner_restricted() throws Authe } @Test(expected=PermissionDeniedException.class) - public void changeDocumentGroupToRemovedGroupAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToRemovedGroupAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USERRM_NAME, USER1_NAME); @@ -1353,7 +1354,7 @@ public void changeDocumentGroupToRemovedGroupAsNonOwner() throws AuthenticationE } @Test(expected=PermissionDeniedException.class) - public void changeDocumentGroupToRemovedGroupAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void changeDocumentGroupToRemovedGroupAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeGroup(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), USERRM_NAME, USER1_NAME); @@ -1363,31 +1364,31 @@ public void changeDocumentGroupToRemovedGroupAsNonOwner_restricted() throws Auth //TODO need tests for changing owner like "user:group" and checking both resultant group and owner @Test - public void ChangeCollectionOwnerAndGroupToNonExistentAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeCollectionOwnerAndGroupToNonExistentAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), Tuple("no-such-user", "no-such-group"), Tuple(USER1_NAME, USER1_NAME)); } @Test - public void ChangeCollectionOwnerAndGroupToNonExistentAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeCollectionOwnerAndGroupToNonExistentAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), Tuple("no-such-user", "no-such-group"), Tuple(USER1_NAME, USER1_NAME)); } @Test - public void ChangeCollectionOwnerAndGroupToRemovedAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeCollectionOwnerAndGroupToRemovedAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), Tuple(USERRM_NAME, USERRM_NAME), Tuple(USER1_NAME, USER1_NAME)); } @Test - public void ChangeCollectionOwnerAndGroupToRemovedAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeCollectionOwnerAndGroupToRemovedAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), Tuple(USERRM_NAME, USERRM_NAME), Tuple(USER1_NAME, USER1_NAME)); } @Test - public void ChangeCollectionOwnerAndGroupToNonExistentAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeCollectionOwnerAndGroupToNonExistentAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), Tuple("no-such-user", "no-such-group"), Tuple(USER1_NAME, USER1_NAME)); } @@ -1396,13 +1397,13 @@ public void ChangeCollectionOwnerAndGroupToNonExistentAsNonDBAOwner() throws Aut * With {@code posix-chown-restricted="true"}, * as the collection owner user change the owner of {@link #USER1_COL1} from "user1" to "no-such-user". */ - public void ChangeCollectionOwnerAndGroupToNonExistentAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeCollectionOwnerAndGroupToNonExistentAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), Tuple("no-such-user", "no-such-group"), Tuple(USER1_NAME, USER1_NAME)); } @Test - public void ChangeCollectionOwnerAndGroupToRemovedAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeCollectionOwnerAndGroupToRemovedAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), Tuple(USERRM_NAME, USERRM_NAME), Tuple(USER1_NAME, USER1_NAME)); } @@ -1412,7 +1413,7 @@ public void ChangeCollectionOwnerAndGroupToRemovedAsNonDBAOwner() throws Authent * as the collection owner user change the owner of {@link #USER1_COL1} from "user1" to "userrm". */ @Test(expected=PermissionDeniedException.class) - public void ChangeCollectionOwnerAndGroupToRemovedAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeCollectionOwnerAndGroupToRemovedAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), Tuple(USERRM_NAME, USERRM_NAME), Tuple(USER1_NAME, USER1_NAME)); @@ -1420,7 +1421,7 @@ public void ChangeCollectionOwnerAndGroupToRemovedAsNonDBAOwner_restricted() thr } @Test(expected=PermissionDeniedException.class) - public void ChangeCollectionOwnerAndGroupToNonExistentAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeCollectionOwnerAndGroupToNonExistentAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), Tuple("no-such-user", "no-such-group"), Tuple(USER1_NAME, USER1_NAME)); @@ -1428,7 +1429,7 @@ public void ChangeCollectionOwnerAndGroupToNonExistentAsNonOwner() throws Authen } @Test(expected=PermissionDeniedException.class) - public void ChangeCollectionOwnerAndGroupToNonExistentAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeCollectionOwnerAndGroupToNonExistentAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), Tuple("no-such-user", "no-such-group"), Tuple(USER1_NAME, USER1_NAME)); @@ -1436,7 +1437,7 @@ public void ChangeCollectionOwnerAndGroupToNonExistentAsNonOwner_restricted() th } @Test(expected=PermissionDeniedException.class) - public void ChangeCollectionOwnerAndGroupToRemovedAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeCollectionOwnerAndGroupToRemovedAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), Tuple(USERRM_NAME, USERRM_NAME), Tuple(USER1_NAME, USER1_NAME)); @@ -1444,7 +1445,7 @@ public void ChangeCollectionOwnerAndGroupToRemovedAsNonOwner() throws Authentica } @Test(expected=PermissionDeniedException.class) - public void ChangeCollectionOwnerAndGroupToRemovedAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeCollectionOwnerAndGroupToRemovedAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_COL1), Tuple(USERRM_NAME, USERRM_NAME), Tuple(USER1_NAME, USER1_NAME)); @@ -1452,31 +1453,31 @@ public void ChangeCollectionOwnerAndGroupToRemovedAsNonOwner_restricted() throws } @Test - public void ChangeDocumentOwnerAndGroupToNonExistentAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeDocumentOwnerAndGroupToNonExistentAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), Tuple("no-such-user", "no-such-group"), Tuple(USER1_NAME, USER1_NAME)); } @Test - public void ChangeDocumentOwnerAndGroupToNonExistentAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeDocumentOwnerAndGroupToNonExistentAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), Tuple("no-such-user", "no-such-group"), Tuple(USER1_NAME, USER1_NAME)); } @Test - public void ChangeDocumentOwnerAndGroupToRemovedAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeDocumentOwnerAndGroupToRemovedAsDBA() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), Tuple(USERRM_NAME, USERRM_NAME), Tuple(USER1_NAME, USER1_NAME)); } @Test - public void ChangeDocumentOwnerAndGroupToRemovedAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeDocumentOwnerAndGroupToRemovedAsDBA_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject adminUser = existWebServer.getBrokerPool().getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); changeOwner(adminUser, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), Tuple(USERRM_NAME, USERRM_NAME), Tuple(USER1_NAME, USER1_NAME)); } @Test - public void ChangeDocumentOwnerAndGroupToNonExistentAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeDocumentOwnerAndGroupToNonExistentAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), Tuple("no-such-user", "no-such-group"), Tuple(USER1_NAME, USER1_NAME)); } @@ -1486,7 +1487,7 @@ public void ChangeDocumentOwnerAndGroupToNonExistentAsNonDBAOwner() throws Authe * as the document owner user change the owner of {@link #USER1_DOC1} from "user1" to "no-such-user". */ @Test(expected=PermissionDeniedException.class) - public void ChangeDocumentOwnerAndGroupToNonExistentAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeDocumentOwnerAndGroupToNonExistentAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), Tuple("no-such-user", "no-such-group"), Tuple(USER1_NAME, USER1_NAME)); @@ -1494,7 +1495,7 @@ public void ChangeDocumentOwnerAndGroupToNonExistentAsNonDBAOwner_restricted() t } @Test - public void ChangeDocumentOwnerAndGroupToRemovedAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeDocumentOwnerAndGroupToRemovedAsNonDBAOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), Tuple(USERRM_NAME, USERRM_NAME), Tuple(USER1_NAME, USER1_NAME)); } @@ -1504,7 +1505,7 @@ public void ChangeDocumentOwnerAndGroupToRemovedAsNonDBAOwner() throws Authentic * as the document owner user change the owner of {@link #USER1_DOC1} from "user1" to "no-such-user". */ @Test(expected=PermissionDeniedException.class) - public void ChangeDocumentOwnerAndGroupToRemovedAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeDocumentOwnerAndGroupToRemovedAsNonDBAOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user1 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER1_NAME, USER1_PWD); changeOwner(user1, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), Tuple(USERRM_NAME, USERRM_NAME), Tuple(USER1_NAME, USER1_NAME)); @@ -1512,7 +1513,7 @@ public void ChangeDocumentOwnerAndGroupToRemovedAsNonDBAOwner_restricted() throw } @Test(expected=PermissionDeniedException.class) - public void ChangeDocumentOwnerAndGroupToNonExistentAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeDocumentOwnerAndGroupToNonExistentAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), Tuple("no-such-user", "no-such-group"), Tuple(USER1_NAME, USER1_NAME)); @@ -1520,7 +1521,7 @@ public void ChangeDocumentOwnerAndGroupToNonExistentAsNonOwner() throws Authenti } @Test(expected=PermissionDeniedException.class) - public void ChangeDocumentOwnerAndGroupToNonExistentAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeDocumentOwnerAndGroupToNonExistentAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), Tuple("no-such-user", "no-such-group"), Tuple(USER1_NAME, USER1_NAME)); @@ -1528,7 +1529,7 @@ public void ChangeDocumentOwnerAndGroupToNonExistentAsNonOwner_restricted() thro } @Test(expected=PermissionDeniedException.class) - public void ChangeDocumentOwnerAndGroupToRemovedAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeDocumentOwnerAndGroupToRemovedAsNonOwner() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, NOT_RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), Tuple(USERRM_NAME, USERRM_NAME), Tuple(USER1_NAME, USER1_NAME)); @@ -1536,22 +1537,22 @@ public void ChangeDocumentOwnerAndGroupToRemovedAsNonOwner() throws Authenticati } @Test(expected=PermissionDeniedException.class) - public void ChangeDocumentOwnerAndGroupToRemovedAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException { + public void ChangeDocumentOwnerAndGroupToRemovedAsNonOwner_restricted() throws AuthenticationException, XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDeniedWithAuth(() -> { final Subject user2 = existWebServer.getBrokerPool().getSecurityManager().authenticate(USER2_NAME, USER2_PWD); changeOwner(user2, RESTRICTED, TestConstants.TEST_COLLECTION_URI.append(USER1_DOC1), Tuple(USERRM_NAME, USERRM_NAME), Tuple(USER1_NAME, USER1_NAME)); }); } - private void changeOwner(final Subject execAsUser, final boolean restricted, final XmldbURI uri, final String newOwner) throws EXistException, PermissionDeniedException, XPathException { + private void changeOwner(final Subject execAsUser, final boolean restricted, final XmldbURI uri, final String newOwner) throws EXistException, PermissionDeniedException, XPathException, IOException { changeOwner(execAsUser, restricted, uri, newOwner, newOwner); } - private void changeOwner(final Subject execAsUser, final boolean restricted, final XmldbURI uri, final Tuple2 newOwnerGroup, final Tuple2 expectedOwnerGroup) throws EXistException, PermissionDeniedException, XPathException { + private void changeOwner(final Subject execAsUser, final boolean restricted, final XmldbURI uri, final Tuple2 newOwnerGroup, final Tuple2 expectedOwnerGroup) throws EXistException, PermissionDeniedException, XPathException, IOException { changeOwner(execAsUser, restricted, uri, newOwnerGroup.fold(og -> og._1 + ":" + og._2), expectedOwnerGroup.fold(og -> og._1 + ":" + og._2)); } - private void changeOwner(final Subject execAsUser, final boolean restricted, final XmldbURI uri, final String newOwnerGroup, final String expectedOwnerGroup) throws EXistException, PermissionDeniedException, XPathException { + private void changeOwner(final Subject execAsUser, final boolean restricted, final XmldbURI uri, final String newOwnerGroup, final String expectedOwnerGroup) throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final boolean prevRestricted = setPosixChownRestricted(restricted); @@ -1563,8 +1564,7 @@ private void changeOwner(final Subject execAsUser, final boolean restricted, fin try (final DBBroker broker = pool.get(Optional.of(execAsUser))) { - final XQuery xquery = existWebServer.getBrokerPool().getXQueryService(); - final Sequence result = xquery.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(2, result.getItemCount()); @@ -1579,11 +1579,11 @@ private void changeOwner(final Subject execAsUser, final boolean restricted, fin } } - private void changeGroup(final Subject execAsUser, final boolean restricted, final XmldbURI uri, final String newGroup) throws EXistException, PermissionDeniedException, XPathException { + private void changeGroup(final Subject execAsUser, final boolean restricted, final XmldbURI uri, final String newGroup) throws EXistException, PermissionDeniedException, XPathException, IOException { changeGroup(execAsUser, restricted, uri, newGroup, newGroup); } - private void changeGroup(final Subject execAsUser, final boolean restricted, final XmldbURI uri, final String newGroup, final String expectedGroup) throws EXistException, PermissionDeniedException, XPathException { + private void changeGroup(final Subject execAsUser, final boolean restricted, final XmldbURI uri, final String newGroup, final String expectedGroup) throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final boolean prevRestricted = setPosixChownRestricted(restricted); @@ -1595,8 +1595,7 @@ private void changeGroup(final Subject execAsUser, final boolean restricted, fin try (final DBBroker broker = pool.get(Optional.of(execAsUser))) { - final XQuery xquery = existWebServer.getBrokerPool().getXQueryService(); - final Sequence result = xquery.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, result.getItemCount()); assertEquals(expectedGroup, result.itemAt(0).getStringValue()); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/SecurityManagerTestUtil.java b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/SecurityManagerTestUtil.java index 0000ed92c4..12e0279a12 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/SecurityManagerTestUtil.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/SecurityManagerTestUtil.java @@ -20,8 +20,8 @@ */ package org.exist.xquery.functions.securitymanager; -import com.evolvedbinary.j8fu.function.Runnable3E; import com.evolvedbinary.j8fu.function.Runnable4E; +import com.evolvedbinary.j8fu.function.Runnable5E; import com.evolvedbinary.j8fu.tuple.Tuple2; import org.exist.EXistException; import org.exist.collections.Collection; @@ -32,6 +32,7 @@ import org.exist.security.SecurityManager; import org.exist.security.internal.aider.GroupAider; import org.exist.security.internal.aider.UserAider; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.lock.Lock; @@ -39,7 +40,7 @@ import org.exist.util.LockException; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import javax.annotation.Nullable; @@ -103,48 +104,45 @@ static void removeGroup(final SecurityManager sm, final String groupname) throws sm.deleteGroup(groupname); } - static Sequence xqueryAddUserAsGroupManager(final BrokerPool pool, final String username, final String groupname) throws EXistException, PermissionDeniedException, XPathException { + static Sequence xqueryAddUserAsGroupManager(final BrokerPool pool, final String username, final String groupname) throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "import module namespace sm = 'http://exist-db.org/xquery/securitymanager';\n" + "sm:add-group-manager('" + groupname + "', '" + username + "')"; try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = pool.getXQueryService(); - final Sequence result = xquery.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; return result; } } - static Sequence xqueryRemoveUserFromGroup(final BrokerPool pool, final String username, final String groupname) throws XPathException, PermissionDeniedException, EXistException { + static Sequence xqueryRemoveUserFromGroup(final BrokerPool pool, final String username, final String groupname) throws XPathException, PermissionDeniedException, EXistException, IOException { final Optional asUser = Optional.of(pool.getSecurityManager().getSystemSubject()); return xqueryRemoveUserFromGroup(pool, username, groupname, asUser); } - static Sequence xqueryRemoveUserFromGroup(final BrokerPool pool, final String username, final String groupname, final Optional asUser) throws EXistException, PermissionDeniedException, XPathException { + static Sequence xqueryRemoveUserFromGroup(final BrokerPool pool, final String username, final String groupname, final Optional asUser) throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "import module namespace sm = 'http://exist-db.org/xquery/securitymanager';\n" + "sm:remove-group-member('" + groupname + "', '" + username + "')"; try (final DBBroker broker = pool.get(asUser)) { - final XQuery xquery = pool.getXQueryService(); - final Sequence result = xquery.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; return result; } } - static Sequence xqueryRemoveGroup(final BrokerPool pool, final String groupname) throws EXistException, PermissionDeniedException, XPathException { + static Sequence xqueryRemoveGroup(final BrokerPool pool, final String groupname) throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "import module namespace sm = 'http://exist-db.org/xquery/securitymanager';\n" + "sm:remove-group('" + groupname + "')"; try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = pool.getXQueryService(); - final Sequence result = xquery.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; return result; } } - static void xqueryChangeMode(final BrokerPool pool, final Subject execAsUser, final XmldbURI uri, final String newMode) throws EXistException, PermissionDeniedException, XPathException { + static void xqueryChangeMode(final BrokerPool pool, final Subject execAsUser, final XmldbURI uri, final String newMode) throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "import module namespace sm = 'http://exist-db.org/xquery/securitymanager';\n" + "sm:chmod(xs:anyURI('" + uri.getRawCollectionPath() + "'), '" + newMode + "'),\n" + @@ -152,8 +150,7 @@ static void xqueryChangeMode(final BrokerPool pool, final Subject execAsUser, fi try (final DBBroker broker = pool.get(Optional.of(execAsUser))) { - final XQuery xquery = pool.getXQueryService(); - final Sequence result = xquery.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, result.getItemCount()); assertEquals(newMode, result.itemAt(0).getStringValue()); @@ -173,10 +170,10 @@ static void removeCollection(final DBBroker broker, final Txn transaction, final } } - static void extractPermissionDenied(final Runnable3E runnable) throws XPathException, PermissionDeniedException, EXistException { + static void extractPermissionDenied(final Runnable4E runnable) throws XPathException, PermissionDeniedException, EXistException, IOException { try { runnable.run(); - } catch (final XPathException e) { + } catch (final XPathException | IOException e) { if (e.getCause() != null && e.getCause() instanceof PermissionDeniedException) { throw (PermissionDeniedException)e.getCause(); } else { @@ -185,7 +182,7 @@ static void extractPermissionDenied(final Runnable3E runnable) throws XPathException, AuthenticationException, PermissionDeniedException, EXistException { + static void extractPermissionDeniedWithAuth(final Runnable5E runnable) throws XPathException, AuthenticationException, PermissionDeniedException, EXistException, IOException { try { runnable.run(); } catch (final XPathException e) { diff --git a/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformTest.java b/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformTest.java index 18b36c5d60..8912e29f39 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformTest.java @@ -50,6 +50,7 @@ import org.exist.collections.Collection; import org.exist.collections.triggers.TriggerException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.lock.Lock; @@ -60,7 +61,7 @@ import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Item; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.Type; @@ -236,12 +237,11 @@ public class TransformTest { * {@see https://github.com/eXist-db/exist/issues/1506} */ @Test - public void keys() throws EXistException, PermissionDeniedException, XPathException { + public void keys() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence sequence = xquery.execute(broker, LIST_OPS_XQUERY, null); + final Sequence sequence = XQueryUtil.query(broker, new StringSource(LIST_OPS_XQUERY), false, null, null, null, null, null).result; assertNotNull(sequence); assertEquals(1, sequence.getItemCount()); @@ -261,11 +261,10 @@ public void keys() throws EXistException, PermissionDeniedException, XPathExcept @Ignore("https://github.com/eXist-db/exist/issues/2096") @Test - public void xslDocument() throws EXistException, PermissionDeniedException, XPathException { + public void xslDocument() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence sequence = xquery.execute(broker, DOCUMENT_XSLT_QUERY, null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + final Sequence sequence = XQueryUtil.query(broker, new StringSource(DOCUMENT_XSLT_QUERY), false, null, null, null, null, null).result; assertNotNull(sequence); assertTrue(sequence.hasOne()); @@ -326,11 +325,10 @@ public void twoNodesCountDescendants() throws EXistException, PermissionDeniedEx transform_twoNodesCountDescendants(); } - private static void transform1(final XmldbURI collectionUri) throws EXistException, PermissionDeniedException, XPathException { + private static void transform1(final XmldbURI collectionUri) throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence sequence = xquery.execute(broker, getCountDescendantsXquery(collectionUri), null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + final Sequence sequence = XQueryUtil.query(broker, new StringSource(getCountDescendantsXquery(collectionUri)), false, null, null, null, null, null).result; assertNotNull(sequence); assertTrue(sequence.hasOne()); @@ -349,7 +347,7 @@ private static void transform1(final XmldbURI collectionUri) throws EXistExcepti private void reindex(final XmldbURI collectionUri) throws EXistException, PermissionDeniedException, IOException, LockException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = pool.getTransactionManager().beginTransaction()) { broker.reindexCollection(transaction, collectionUri); transaction.commit(); @@ -379,11 +377,10 @@ private static String getCountDescendantsXslt(final XmldbURI collectionUri) { ""; } - private static void transform_twoNodesCountDescendants() throws EXistException, PermissionDeniedException, XPathException { + private static void transform_twoNodesCountDescendants() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence sequence = xquery.execute(broker, COUNT_DESCENDANTS_TWO_NODES_QUERY, null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + final Sequence sequence = XQueryUtil.query(broker, new StringSource(COUNT_DESCENDANTS_TWO_NODES_QUERY), false, null, null, null, null, null).result; assertNotNull(sequence); assertTrue(sequence.hasOne()); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/util/ParseHtmlTest.java b/exist-core/src/test/java/org/exist/xquery/functions/util/ParseHtmlTest.java index dc56e9f101..45f39ca563 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/util/ParseHtmlTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/util/ParseHtmlTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -24,10 +48,11 @@ import org.exist.EXistException; import org.exist.dom.memtree.DocumentImpl; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.DBBroker; import org.exist.test.ExistEmbeddedServer; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.ClassRule; import org.junit.Test; @@ -37,6 +62,8 @@ import javax.xml.transform.Source; +import java.io.IOException; + import static org.junit.Assert.*; public class ParseHtmlTest { @@ -45,12 +72,11 @@ public class ParseHtmlTest { public static final ExistEmbeddedServer server = new ExistEmbeddedServer(true, true); @Test - public void parseHtml() throws EXistException, PermissionDeniedException, XPathException { + public void parseHtml() throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "util:parse-html(\"

hello

\")"; - final XQuery xquery = server.getBrokerPool().getXQueryService(); try (final DBBroker broker = server.getBrokerPool().getBroker()) { - final Sequence result = xquery.execute(broker, query, null); + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, result.getItemCount()); assertTrue(result.itemAt(0) instanceof DocumentImpl); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/xquery3/SerializeTest.java b/exist-core/src/test/java/org/exist/xquery/functions/xquery3/SerializeTest.java index 733c2e57a0..03dfebb446 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/xquery3/SerializeTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/xquery3/SerializeTest.java @@ -24,6 +24,7 @@ import org.exist.EXistException; import org.exist.collections.Collection; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.lock.ManagedCollectionLock; @@ -33,7 +34,7 @@ import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -76,7 +77,7 @@ public class SerializeTest { " fn:serialize($doc, map { xs:QName(\"exist:add-exist-id\"): \"all\" })"; @Test - public void serializeReference() throws XPathException, PermissionDeniedException, EXistException { + public void serializeReference() throws XPathException, PermissionDeniedException, EXistException, IOException { final String expected = "123"; expectQueryString(SERIALIZE_WITH_EXIST_ID_ALL_QUERY, expected); } @@ -107,7 +108,7 @@ private static void createCollection(final DBBroker broker, final Txn transactio } } - private static void expectQueryNode(final String query, final Source expected) throws EXistException, XPathException, PermissionDeniedException { + private static void expectQueryNode(final String query, final Source expected) throws EXistException, XPathException, PermissionDeniedException, IOException { expectQuery(query, sequence -> { assertNotNull(sequence); assertTrue(sequence.hasOne()); @@ -128,7 +129,7 @@ private static void expectQueryNode(final String query, final Source expected) t }); } - private static void expectQueryString(final String query, final String expected) throws EXistException, XPathException, PermissionDeniedException { + private static void expectQueryString(final String query, final String expected) throws EXistException, XPathException, PermissionDeniedException, IOException { expectQuery(query, sequence -> { assertNotNull(sequence); assertTrue(sequence.hasOne()); @@ -141,13 +142,11 @@ private static void expectQueryString(final String query, final String expected) }); } - private static void expectQuery(final String query, final Consumer resultConsumer) throws EXistException, XPathException, PermissionDeniedException { + private static void expectQuery(final String query, final Consumer resultConsumer) throws EXistException, XPathException, PermissionDeniedException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = pool.getXQueryService(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence sequence = xquery.execute(broker, query, null); - - resultConsumer.accept(sequence); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + resultConsumer.accept(result); } } } diff --git a/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTriggersDefragTest.java b/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTriggersDefragTest.java index 9aade4305a..ba3d3f5c9e 100644 --- a/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTriggersDefragTest.java +++ b/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTriggersDefragTest.java @@ -57,6 +57,7 @@ import org.exist.test.TestConstants; import org.exist.util.StringInputSource; import org.exist.xquery.XPathException; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.Before; import org.junit.ClassRule; @@ -66,8 +67,6 @@ import java.io.IOException; import java.util.Optional; -import static org.exist.test.Util.executeQuery; -import static org.exist.test.Util.withCompiledQuery; import static org.exist.util.PropertiesBuilder.propertiesBuilder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -111,11 +110,9 @@ private void assertQuery(final String query, final Consumer2E { - final Sequence results = executeQuery(broker, compiledQuery); - assertions.accept(results); - return null; - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + + assertions.accept(queryResult.result); transaction.commit(); } diff --git a/extensions/contentextraction/pom.xml b/extensions/contentextraction/pom.xml index b8f793be76..4778602c26 100644 --- a/extensions/contentextraction/pom.xml +++ b/extensions/contentextraction/pom.xml @@ -202,21 +202,9 @@ src/test/resources/log4j2.xml src/main/java/org/exist/contentextraction/ContentReceiver.java src/test/java/org/exist/contentextraction/xquery/ContentFunctionsTest.java - src/test/java/org/exist/contentextraction/xquery/Util.java - - -
${project.parent.relativePath}/../exist-parent/FDB-backport-to-existdb-LGPL-21-ONLY-license.template.txt
- - src/test/java/org/exist/contentextraction/xquery/Util.java - - -
- diff --git a/extensions/contentextraction/src/test/java/org/exist/contentextraction/xquery/ContentFunctionsTest.java b/extensions/contentextraction/src/test/java/org/exist/contentextraction/xquery/ContentFunctionsTest.java index 7ec5b5b43a..33cccb3b4b 100644 --- a/extensions/contentextraction/src/test/java/org/exist/contentextraction/xquery/ContentFunctionsTest.java +++ b/extensions/contentextraction/src/test/java/org/exist/contentextraction/xquery/ContentFunctionsTest.java @@ -45,7 +45,6 @@ */ package org.exist.contentextraction.xquery; -import com.evolvedbinary.j8fu.tuple.Tuple2; import org.exist.EXistException; import org.exist.collections.Collection; import org.exist.collections.triggers.TriggerException; @@ -60,7 +59,7 @@ import org.exist.util.LockException; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.value.Sequence; +import org.exist.xquery.XQueryUtil; import org.junit.*; import xyz.elemental.mediatype.MediaType; @@ -68,9 +67,6 @@ import java.io.InputStream; import java.util.Optional; -import static com.evolvedbinary.j8fu.tuple.Tuple.Tuple; -import static org.exist.contentextraction.xquery.Util.executeQuery; -import static org.exist.contentextraction.xquery.Util.withCompiledQuery; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -133,17 +129,14 @@ public void getMetadataFromPdf() throws EXistException, XPathException, Permissi try (final DBBroker broker = pool.getBroker(); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final Tuple2 metadata = withCompiledQuery(broker, mainQuerySource, mainCompiledQuery -> { - final Sequence result = executeQuery(broker, mainCompiledQuery); - assertEquals(2, result.getItemCount()); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, mainQuerySource, false, null, null, null, null, null); - return Tuple(result.itemAt(0).toJavaObject(int.class), result.itemAt(1).getStringValue()); - }); + assertEquals(2, queryResult.result.getItemCount()); transaction.commit(); - assertEquals(1, metadata._1.intValue()); - assertEquals(MediaType.APPLICATION_PDF, metadata._2); + assertEquals(1, (int) queryResult.result.itemAt(0).toJavaObject(int.class)); + assertEquals(MediaType.APPLICATION_PDF, queryResult.result.itemAt(1).getStringValue()); } } @@ -162,16 +155,13 @@ public void getMetadataAndContentFromPdf() throws EXistException, XPathException try (final DBBroker broker = pool.getBroker(); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final String content = withCompiledQuery(broker, mainQuerySource, mainCompiledQuery -> { - final Sequence result = executeQuery(broker, mainCompiledQuery); - assertEquals(1, result.getItemCount()); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, mainQuerySource, false, null, null, null, null, null); - return result.itemAt(0).getStringValue(); - }); + assertEquals(1, queryResult.result.getItemCount()); transaction.commit(); - assertEquals("Hello World", content); + assertEquals("Hello World", queryResult.result.itemAt(0).getStringValue()); } } @@ -191,17 +181,14 @@ public void getMetadataFromXlsx() throws EXistException, XPathException, Permiss try (final DBBroker broker = pool.getBroker(); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final Tuple2 metadata = withCompiledQuery(broker, mainQuerySource, mainCompiledQuery -> { - final Sequence result = executeQuery(broker, mainCompiledQuery); - assertEquals(2, result.getItemCount()); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, mainQuerySource, false, null, null, null, null, null); - return Tuple(result.itemAt(0).toJavaObject(int.class), result.itemAt(1).getStringValue()); - }); + assertEquals(2, queryResult.result.getItemCount()); transaction.commit(); - assertEquals(1, metadata._1.intValue()); - assertEquals(MediaType.APPLICATION_PDF, metadata._2); + assertEquals(1, (int) queryResult.result.itemAt(0).toJavaObject(int.class)); + assertEquals(MediaType.APPLICATION_PDF, queryResult.result.itemAt(1).getStringValue()); } } } diff --git a/extensions/contentextraction/src/test/java/org/exist/contentextraction/xquery/Util.java b/extensions/contentextraction/src/test/java/org/exist/contentextraction/xquery/Util.java deleted file mode 100644 index e55486a05f..0000000000 --- a/extensions/contentextraction/src/test/java/org/exist/contentextraction/xquery/Util.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2014, Evolved Binary Ltd - * - * This file was originally ported from FusionDB to eXist-db by - * Evolved Binary, for the benefit of the eXist-db Open Source community. - * Only the ported code as it appears in this file, at the time that - * it was contributed to eXist-db, was re-licensed under The GNU - * Lesser General Public License v2.1 only for use in eXist-db. - * - * This license grant applies only to a snapshot of the code as it - * appeared when ported, it does not offer or infer any rights to either - * updates of this source code or access to the original source code. - * - * The GNU Lesser General Public License v2.1 only license follows. - * - * ===================================================================== - * - * Copyright (C) 2014, Evolved Binary Ltd - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version 2.1. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ -package org.exist.contentextraction.xquery; - -import com.evolvedbinary.j8fu.function.Function2E; -import org.exist.security.PermissionDeniedException; -import org.exist.source.Source; -import org.exist.storage.BrokerPool; -import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; -import org.exist.xquery.CompiledXQuery; -import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; -import org.exist.xquery.XQueryContext; -import org.exist.xquery.value.Sequence; - -import javax.annotation.Nullable; -import java.io.IOException; -import java.util.Properties; - -/** - * Tests utility methods. - * - * @author Adam Retter - */ -public class Util { - static Sequence executeQuery(final DBBroker broker, final CompiledXQuery compiledXQuery) throws PermissionDeniedException, XPathException { - final BrokerPool pool = broker.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - return xqueryService.execute(broker, compiledXQuery, null, new Properties()); - } - - static T withCompiledQuery(final DBBroker broker, final Source source, final Function2E op) throws XPathException, PermissionDeniedException, IOException { - final BrokerPool pool = broker.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - final XQueryPool xqueryPool = pool.getXQueryPool(); - final CompiledXQuery compiledQuery = compileQuery(broker, xqueryService, xqueryPool, source); - try { - return op.apply(compiledQuery); - } finally { - if (compiledQuery != null) { - if (compiledQuery.getContext() != null) { - compiledQuery.getContext().runCleanupTasks(); - } - xqueryPool.returnCompiledXQuery(source, compiledQuery); - } - } - } - - static CompiledXQuery compileQuery(final DBBroker broker, final XQuery xqueryService, final XQueryPool xqueryPool, final Source query) throws PermissionDeniedException, XPathException, IOException { - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - compiled = xqueryPool.borrowCompiledXQuery(broker, query); - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - if (compiled == null) { - compiled = xqueryService.compile(context, query); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } - - return compiled; - - } catch (final PermissionDeniedException | XPathException | IOException e) { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - xqueryPool.returnCompiledXQuery(query, compiled); - } - throw e; - } - } -} diff --git a/extensions/expath/pom.xml b/extensions/expath/pom.xml index e74c5c3d3f..621233a55a 100644 --- a/extensions/expath/pom.xml +++ b/extensions/expath/pom.xml @@ -76,6 +76,12 @@ ${project.version} + + com.evolvedbinary.j8fu + j8fu + test + + commons-io commons-io @@ -169,6 +175,7 @@ pom.xml src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml + src/test/java/org/expath/exist/HttpClientTest.java src/main/java/org/expath/httpclient/model/exist/EXistTreeBuilder.java @@ -182,6 +189,7 @@ pom.xml src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml + src/test/java/org/expath/exist/HttpClientTest.java src/main/java/org/expath/httpclient/model/exist/EXistTreeBuilder.java diff --git a/extensions/expath/src/test/java/org/expath/exist/HttpClientTest.java b/extensions/expath/src/test/java/org/expath/exist/HttpClientTest.java index c91858102e..d13faa3e26 100644 --- a/extensions/expath/src/test/java/org/expath/exist/HttpClientTest.java +++ b/extensions/expath/src/test/java/org/expath/exist/HttpClientTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -23,11 +47,12 @@ import org.exist.EXistException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.test.ExistEmbeddedServer; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.ClassRule; import org.junit.Test; @@ -48,7 +73,7 @@ public class HttpClientTest { public static ExistEmbeddedServer existEmbeddedServer = new ExistEmbeddedServer(true, true); @Test - public void readResponse() throws XPathException, PermissionDeniedException, EXistException { + public void readResponse() throws XPathException, PermissionDeniedException, EXistException, IOException { assumeTrue("No Internet access: skipping 'readResponse' test", hasInternetAccess()); final String query = @@ -66,11 +91,10 @@ public void readResponse() throws XPathException, PermissionDeniedException, EXi assertEquals(1, result.getItemCount()); } - private Sequence executeQuery(final String query) throws EXistException, PermissionDeniedException, XPathException { + private Sequence executeQuery(final String query) throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool brokerPool = existEmbeddedServer.getBrokerPool(); - final XQuery xquery = brokerPool.getXQueryService(); try (final DBBroker broker = brokerPool.getBroker()) { - return xquery.execute(broker, query, null); + return XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; } } diff --git a/extensions/indexes/indexes-integration-tests/pom.xml b/extensions/indexes/indexes-integration-tests/pom.xml index da697c51b2..6ee71fe35b 100644 --- a/extensions/indexes/indexes-integration-tests/pom.xml +++ b/extensions/indexes/indexes-integration-tests/pom.xml @@ -78,6 +78,12 @@ test + + com.evolvedbinary.j8fu + j8fu + test + + com.evolvedbinary.thirdparty.xml-apis xml-apis @@ -154,6 +160,7 @@ pom.xml src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml + src/test/java/org/exist/indexing/EnforceIndexUseTest.java @@ -166,6 +173,7 @@ pom.xml src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml + src/test/java/org/exist/indexing/EnforceIndexUseTest.java diff --git a/extensions/indexes/indexes-integration-tests/src/test/java/org/exist/indexing/EnforceIndexUseTest.java b/extensions/indexes/indexes-integration-tests/src/test/java/org/exist/indexing/EnforceIndexUseTest.java index e12fea8a53..75dccfde87 100644 --- a/extensions/indexes/indexes-integration-tests/src/test/java/org/exist/indexing/EnforceIndexUseTest.java +++ b/extensions/indexes/indexes-integration-tests/src/test/java/org/exist/indexing/EnforceIndexUseTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -30,6 +54,7 @@ import org.exist.dom.persistent.DocumentSet; import org.exist.dom.persistent.MutableDocumentSet; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.txn.TransactionManager; @@ -41,9 +66,8 @@ import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; import org.exist.xquery.XQueryContext; -import org.exist.xquery.value.Sequence; +import org.exist.xquery.XQueryUtil; import org.junit.*; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -97,16 +121,15 @@ public static java.util.Collection data() { ""; @Test - public void matchesWithDiffrentIndexStyles() throws PermissionDeniedException, EXistException, XPathException { + public void matchesWithDiffrentIndexStyles() throws PermissionDeniedException, EXistException, XPathException, IOException { //query and expand final String query = "for $hit in collection(\"" + TestConstants.TEST_COLLECTION_URI.toString() + "\")//foo[matches(@bar, \"^b\")]\n" + "return $hit"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = pool.getXQueryService(); - final Sequence seq = xquery.execute(broker, query, null); - assertEquals(expectedSearchCount, seq.getItemCount()); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + assertEquals(expectedSearchCount, queryResult.result.getItemCount()); } } diff --git a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/LuceneIndexTest.java b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/LuceneIndexTest.java index 691fb5f41b..aa31583e7f 100644 --- a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/LuceneIndexTest.java +++ b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/LuceneIndexTest.java @@ -51,10 +51,16 @@ import java.io.IOException; import java.io.StringReader; -import java.util.*; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; import javax.xml.XMLConstants; import javax.xml.parsers.ParserConfigurationException; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.exist.EXistException; import org.exist.Indexer; import org.exist.TestUtils; @@ -69,6 +75,7 @@ import org.exist.indexing.OrderedValuesIndex; import org.exist.indexing.QNamedKeysIndex; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.ElementValue; @@ -76,12 +83,15 @@ import org.exist.storage.txn.Txn; import org.exist.test.ExistEmbeddedServer; import org.exist.test.TestConstants; -import org.exist.util.*; +import org.exist.util.Configuration; +import org.exist.util.InputStreamSupplierInputSource; +import org.exist.util.LockException; +import org.exist.util.Occurrences; +import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; -import org.exist.xquery.XQuery; -import org.exist.xquery.XQueryContext; -import org.exist.xquery.CompiledXQuery; import org.exist.xquery.XPathException; +import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.exist.xupdate.Modification; import org.exist.xupdate.XUpdateProcessor; @@ -295,25 +305,28 @@ public void simpleQueries() throws EXistException, CollectionConfigurationExcept checkIndex(docs, broker, new QName[] { attrQN }, "center", 1); checkIndex(docs, broker, new QName[] { attrQN }, "right", 1); - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "/section[ft:query(p, 'content')]", null); + String query = "/section[ft:query(p, 'content')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/section[ft:query(p/@rend, 'center')]", null); + query = "/section[ft:query(p/@rend, 'center')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/section[ft:query(hi, 'just')]", null); + query = "/section[ft:query(hi, 'just')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); - seq = xquery.execute(broker, "/section[ft:query(p/*, 'just')]", null); + query = "/section[ft:query(p/*, 'just')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/section[ft:query(head/*, 'just')]", null); + query = "/section[ft:query(head/*, 'just')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); } @@ -375,15 +388,12 @@ public void moreElaborateQueries() throws EXistException, CollectionConfiguratio // nested should be ignored and not indexed by match="/TEI/text" checkIndex(docs, broker, new QName[]{new QName("text")}, "nested", 0); - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - - String[] searchTerms = { + final String[] searchTerms = { "Buick", "Cadillac", "Dodge", "Ford", "ABuick", "ACadillac", "ADodge", "AFord", }; - String[] queryTemplates = { + final String[] queryTemplates = { "//.[ft:query(title, '%s')]", // Field query with != attribute predicate: : "//.[ft:query-field('not-equals-Sa-Ltn', '%s')]", @@ -393,7 +403,7 @@ public void moreElaborateQueries() throws EXistException, CollectionConfiguratio "//.[ft:query-field('eq-Sa-Ltn', '%s')]", }; - int[][] resultCounts = { + final int[][] resultCounts = { {1, 0, 0, 0 }, {0, 0, 1, 0 }, {0, 1, 1, 1 }, @@ -401,12 +411,12 @@ public void moreElaborateQueries() throws EXistException, CollectionConfiguratio }; for (int qi = 0; qi < queryTemplates.length; ++qi) { - int[] resultCount = resultCounts[qi]; - for (int ri=0; ri < searchTerms.length; ++ri) { - String query = String.format(queryTemplates[qi], searchTerms[ri]); - Sequence seq = xquery.execute(broker, query, null); + final int[] resultCount = resultCounts[qi]; + for (int ri = 0; ri < searchTerms.length; ++ri) { + final String query = String.format(queryTemplates[qi], searchTerms[ri]); + final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); - int expected = resultCount[ri % resultCount.length]; + final int expected = resultCount[ri % resultCount.length]; assertEquals(query, expected, seq.getItemCount()); } } @@ -422,17 +432,18 @@ public void configuration() throws EXistException, CollectionConfigurationExcept checkIndex(docs, broker, new QName[] { new QName("a") }, "x", 1); checkIndex(docs, broker, new QName[] { new QName("c") }, "x", 1); - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "/test[ft:query(a, 'x')]", null); + String query = "/test[ft:query(a, 'x')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/test[ft:query(.//c, 'x')]", null); + query = "/test[ft:query(.//c, 'x')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/test[ft:query(b, 'x')]", null); + query = "/test[ft:query(b, 'x')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); } @@ -452,65 +463,78 @@ public void inlineAndIgnore() throws EXistException, CollectionConfigurationExce checkIndex(docs, broker, new QName[] { new QName("p") }, "ignore", 0); checkIndex(docs, broker, new QName[]{new QName("p")}, "warnings", 1); - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "/article[ft:query(head, 'title')]", null); + String query = "/article[ft:query(head, 'title')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(p, 'highlighted')]", null); + query = "/article[ft:query(p, 'highlighted')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(p, 'mixed')]", null); + query = "/article[ft:query(p, 'mixed')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(p, 'mix')]", null); + query = "/article[ft:query(p, 'mix')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(p, 'dangerous')]", null); + query = "/article[ft:query(p, 'dangerous')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(p, 'ous')]", null); + query = "/article[ft:query(p, 'ous')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(p, 'danger')]", null); + query = "/article[ft:query(p, 'danger')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(p, 'note')]", null); + query = "/article[ft:query(p, 'note')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(., 'highlighted')]", null); + query = "/article[ft:query(., 'highlighted')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(., 'mixed')]", null); + query = "/article[ft:query(., 'mixed')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(., 'dangerous')]", null); + query = "/article[ft:query(., 'dangerous')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(., 'warnings')]", null); + query = "/article[ft:query(., 'warnings')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(., 'danger')]", null); + query = "/article[ft:query(., 'danger')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(., 'note')]", null); + query = "/article[ft:query(., 'note')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); - seq = xquery.execute(broker, "/article[ft:query(., 'ignore')]", null); + query = "/article[ft:query(., 'ignore')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); } @@ -524,10 +548,8 @@ public void attributeMatch() throws EXistException, CollectionConfigurationExcep try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = transact.beginTransaction()) { - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - - Sequence seq = xquery.execute(broker, "for $a in ft:query((//b|//c), 'AAA') order by ft:score($a) descending return xs:string($a)", null); + String query = "for $a in ft:query((//b|//c), 'AAA') order by ft:score($a) descending return xs:string($a)"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(5, seq.getItemCount()); assertEquals("AAA on b2", seq.itemAt(0).getStringValue()); @@ -537,13 +559,15 @@ public void attributeMatch() throws EXistException, CollectionConfigurationExcep assertEquals("AAA on c2", seq.itemAt(4).getStringValue()); // path: /a/b - seq = xquery.execute(broker, "for $a in ft:query(/a/b, 'AAA') order by ft:score($a) descending return xs:string($a)", null); + query = "for $a in ft:query(/a/b, 'AAA') order by ft:score($a) descending return xs:string($a)"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(2, seq.getItemCount()); assertEquals("AAA on b2", seq.itemAt(0).getStringValue()); assertEquals("AAA on b1", seq.itemAt(1).getStringValue()); - seq = xquery.execute(broker, "for $a in ft:query(//@att, 'att') order by ft:score($a) descending return xs:string($a)", null); + query = "for $a in ft:query(//@att, 'att') order by ft:score($a) descending return xs:string($a)"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(4, seq.getItemCount()); assertEquals("att on b2", seq.itemAt(0).getStringValue()); @@ -575,7 +599,8 @@ public void attributeMatch() throws EXistException, CollectionConfigurationExcep proc.reset(); transact.commit(transaction); - seq = xquery.execute(broker, "for $a in ft:query((//b|//c), 'AAA') order by ft:score($a) descending return xs:string($a)", null); + query = "for $a in ft:query((//b|//c), 'AAA') order by ft:score($a) descending return xs:string($a)"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(5, seq.getItemCount()); assertEquals("AAA on b2", seq.itemAt(0).getStringValue()); @@ -588,15 +613,13 @@ public void attributeMatch() throws EXistException, CollectionConfigurationExcep } @Test - public void boosts() throws EXistException, CollectionConfigurationException, PermissionDeniedException, SAXException, TriggerException, LockException, IOException, XPathException { + public void boosts() throws EXistException, CollectionConfigurationException, PermissionDeniedException, SAXException, LockException, IOException, XPathException { configureAndStore(COLLECTION_CONFIG6, XML6, "test.xml"); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "for $a in ft:query((//b|//c), 'AAA') " + - "order by ft:score($a) descending return $a/local-name(.)", null); + final String query = "for $a in ft:query((//b|//c), 'AAA') order by ft:score($a) descending return $a/local-name(.)"; + final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(3, seq.getItemCount()); assertEquals("c", seq.getStringValue()); @@ -604,130 +627,166 @@ public void boosts() throws EXistException, CollectionConfigurationException, Pe } @Test - public void queryTranslation() throws EXistException, CollectionConfigurationException, PermissionDeniedException, SAXException, TriggerException, LockException, IOException, XPathException { + public void queryTranslation() throws EXistException, CollectionConfigurationException, PermissionDeniedException, SAXException, LockException, IOException, XPathException { configureAndStore(COLLECTION_CONFIG1, XML7, "test.xml"); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); + final String query = + "declare variable $q external;\n" + + "ft:query(//p, parse-xml($q)/query)"; - final XQueryContext context = new XQueryContext(broker.getBrokerPool()); - final CompiledXQuery compiled = xquery.compile(context, "declare variable $q external; " + - "ft:query(//p, parse-xml($q)/query)"); + ConsumerE setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("q", true, "heiterkeit"); + }; - context.declareVariable("q", true, "heiterkeit"); - Sequence seq = xquery.execute(broker, compiled, null); + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - context.declareVariable("q", true, - "" + - " " + - " heiterkeitblablabla" + - " " + - ""); - seq = xquery.execute(broker, compiled, null); + setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("q", true, + "" + + " " + + " heiterkeitblablabla" + + " " + + "" + ); + }; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - context.declareVariable("q", true, - "" + - " " + - " heiterkeitblablabla" + - " " + - ""); - seq = xquery.execute(broker, compiled, null); + setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("q", true, + "" + + " " + + " heiterkeitblablabla" + + " " + + "" + ); + }; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - context.declareVariable("q", true, - "" + - " " + - " heiterkeitblablabla" + - " " + - ""); - seq = xquery.execute(broker, compiled, null); + setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("q", true, + "" + + " " + + " heiterkeitblablabla" + + " " + + "" + ); + }; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); - context.declareVariable("q", true, - "" + - " " + - " heiterkeitherzen" + - " " + - ""); - seq = xquery.execute(broker, compiled, null); + setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("q", true, + "" + + " " + + " heiterkeitherzen" + + " " + + "" + ); + }; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); - context.declareVariable("q", true, - "" + - " " + - " wunderbare heiterkeitherzen" + - " " + - ""); - seq = xquery.execute(broker, compiled, null); + setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("q", true, + "" + + " " + + " wunderbare heiterkeitherzen" + + " " + + "" + ); + }; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - context.declareVariable("q", true, - "" + - " heiterkeit seele eingenommen" + - ""); - seq = xquery.execute(broker, compiled, null); + setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("q", true, + "" + + " heiterkeit seele eingenommen" + + "" + ); + }; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); // phrase with wildcards - context.declareVariable("q", true, - "" + - " heiter*se?nnnle*" + - ""); - seq = xquery.execute(broker, compiled, null); + setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("q", true, + "" + + " heiter*se?nnnle*" + + "" + ); + }; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - context.declareVariable("q", true, - "" + - " ?eiter*" + - ""); - seq = xquery.execute(broker, compiled, null); + setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("q", true, + "" + + " ?eiter*" + + "" + ); + }; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - context.declareVariable("q", true, - "" + - " selee" + - ""); - seq = xquery.execute(broker, compiled, null); + setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("q", true, + "" + + " selee" + + "" + ); + }; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - context.declareVariable("q", true, - "" + - " " + - " selee" + - " bla*" + - " " + - ""); - seq = xquery.execute(broker, compiled, null); + setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("q", true, + "" + + " " + + " selee" + + " bla*" + + " " + + "" + ); + }; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - context.declareVariable("q", true, - "" + - " heit.*keit" + - ""); - seq = xquery.execute(broker, compiled, null); + setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("q", true, + "" + + " heit.*keit" + + "" + ); + }; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - context.declareVariable("q", true, - "" + - " wunderbareheit.*keit" + - ""); - seq = xquery.execute(broker, compiled, null); + setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable("q", true, + "" + + " wunderbareheit.*keit" + + "" + ); + }; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); } @@ -742,17 +801,18 @@ public void analyzers() throws EXistException, CollectionConfigurationException, checkIndex(docs, broker, new QName[] { new QName("head") }, "TITLE", 1); checkIndex(docs, broker, new QName[] { new QName("p") }, "uppercase", 1); - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "/section[ft:query(p, 'UPPERCASE')]", null); + String query = "/section[ft:query(p, 'UPPERCASE')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/section[ft:query(head, 'TITLE')]", null); + query = "/section[ft:query(head, 'TITLE')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "/section[ft:query(head, 'title')]", null); + query = "/section[ft:query(head, 'title')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); } @@ -762,26 +822,27 @@ public void analyzers() throws EXistException, CollectionConfigurationException, public void MultiTermQueryRewriteMethod() throws EXistException, CollectionConfigurationException, PermissionDeniedException, SAXException, TriggerException, LockException, IOException, XPathException { configureAndStore(COLLECTION_CONFIG8, XML9, "test.xml"); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "declare namespace tei=\"http://www.tei-c.org/ns/1.0\";" + + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + + String query = "declare namespace tei=\"http://www.tei-c.org/ns/1.0\";" + " for $expr in (\"au*\", \"ha*\", \"ma*\", \"za*\", \"ya*\", \"ra*\", \"qa*\")" + " let $query := {$expr}" + " return for $hit in //tei:p[ft:query(., $query)]" + - " return util:expand($hit)//exist:match", null); + " return util:expand($hit)//exist:match"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(10, seq.getItemCount()); assertEquals("aus", seq.itemAt(0).getStringValue()); - seq = xquery.execute(broker, "declare namespace tei=\"http://www.tei-c.org/ns/1.0\";" + - " for $expr in (\"ha*\", \"ma*\")" + - " let $query := {$expr}" + - " return for $hit in //tei:p[ft:query(., $query)]" + - " return util:expand($hit)//exist:match", null); - assertNotNull(seq); - assertEquals(2 , seq.getItemCount()); - assertEquals("haus", seq.itemAt(0).getStringValue()); + query = "declare namespace tei=\"http://www.tei-c.org/ns/1.0\";" + + " for $expr in (\"ha*\", \"ma*\")" + + " let $query := {$expr}" + + " return for $hit in //tei:p[ft:query(., $query)]" + + " return util:expand($hit)//exist:match"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + assertNotNull(seq); + assertEquals(2 , seq.getItemCount()); + assertEquals("haus", seq.itemAt(0).getStringValue()); } } @@ -806,19 +867,19 @@ public void dropDocuments() throws EXistException, CollectionConfigurationExcept configureAndStore(COLLECTION_CONFIG1, SAMPLES.getShakespeareXmlSampleNames()); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); final TransactionManager transact = pool.getTransactionManager(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { try(final Txn transaction = transact.beginTransaction()) { - Sequence seq = xquery.execute(broker, "//LINE[ft:query(., 'bark')]", null); + String query = "//LINE[ft:query(., 'bark')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(6, seq.getItemCount()); root.removeXMLResource(transaction, broker, XmldbURI.create("r_and_j.xml")); transact.commit(transaction); - seq = xquery.execute(broker, "//LINE[ft:query(., 'bark')]", null); + query = "//LINE[ft:query(., 'bark')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(3, seq.getItemCount()); } @@ -827,7 +888,8 @@ public void dropDocuments() throws EXistException, CollectionConfigurationExcept root.removeXMLResource(transaction, broker, XmldbURI.create("hamlet.xml")); transact.commit(transaction); - Sequence seq = xquery.execute(broker, "//LINE[ft:query(., 'bark')]", null); + String query = "//LINE[ft:query(., 'bark')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); } @@ -839,12 +901,11 @@ public void removeCollection() throws EXistException, CollectionConfigurationExc final DocumentSet docs = configureAndStore(COLLECTION_CONFIG1, SAMPLES.getShakespeareXmlSampleNames()); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); final TransactionManager transact = pool.getTransactionManager(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = transact.beginTransaction()) { - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//SPEECH[ft:query(LINE, 'love')]", null); + String query = "//SPEECH[ft:query(LINE, 'love')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(166, seq.getItemCount()); @@ -902,9 +963,8 @@ public void xupdateRemove() throws EXistException, CollectionConfigurationExcept checkIndex(docs, broker, new QName[] { new QName("item") }, null, 5); checkIndex(docs, broker, new QName[] { new QName("condition") }, null, 2); - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//item[ft:query(description, 'chair')]", null); + String query = "//item[ft:query(description, 'chair')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); @@ -981,9 +1041,8 @@ public void xupdateInsert() throws EXistException, CollectionConfigurationExcept assertEquals("chair", occur[0].getTerm()); checkIndex(docs, broker, new QName[] { new QName("item") }, null, 5); - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//item[ft:query(description, 'chair')]", null); + String query = "//item[ft:query(description, 'chair')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); @@ -1146,9 +1205,8 @@ public void xupdateUpdate() throws EXistException, CollectionConfigurationExcept assertEquals("chair", occur[0].getTerm()); checkIndex(docs, broker, new QName[] { new QName("item") }, null, 5); - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//item[ft:query(description, 'chair')]", null); + String query = "//item[ft:query(description, 'chair')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); @@ -1224,9 +1282,8 @@ public void xupdateReplace() throws EXistException, CollectionConfigurationExcep assertEquals("chair", occur[0].getTerm()); checkIndex(docs, broker, new QName[] { new QName("item") }, null, 5); - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//item[ft:query(description, 'chair')]", null); + String query = "//item[ft:query(description, 'chair')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); diff --git a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/LuceneMatchListenerTest.java b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/LuceneMatchListenerTest.java index 40b19a90af..c93fe6a49c 100644 --- a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/LuceneMatchListenerTest.java +++ b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/LuceneMatchListenerTest.java @@ -52,6 +52,7 @@ import org.exist.collections.CollectionConfigurationManager; import org.exist.collections.triggers.TriggerException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.serializers.EXistOutputKeys; @@ -63,7 +64,7 @@ import org.exist.util.*; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.NodeValue; import org.exist.xquery.value.Sequence; import org.junit.AfterClass; @@ -194,37 +195,38 @@ public void indexByQName() throws EXistException, PermissionDeniedException, XPa configureAndStore(CONF2, XML); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//para[ft:query(., 'mixed')]", null); + String query = "//para[ft:query(., 'mixed')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); String result = queryResult2String(broker, seq); assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with " + MATCH_START + "mixed" + MATCH_END + " content.")); - seq = xquery.execute(broker, "//para[ft:query(., '+nested +inner +elements')]", null); + query = "//para[ft:query(., '+nested +inner +elements')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq); assertThat(result, CompareMatcher.isIdenticalTo("another paragraph with " + MATCH_START + "nested" + MATCH_END + " " + MATCH_START + "inner" + MATCH_END + " " + MATCH_START + "elements" + MATCH_END + ".")); - seq = xquery.execute(broker, "//para[ft:query(term, 'term')]", null); + query = "//para[ft:query(term, 'term')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq); assertThat(result, CompareMatcher.isIdenticalTo("a third paragraph with " + MATCH_START + "term" + MATCH_END + ".")); - seq = xquery.execute(broker, "//para[ft:query(., '+double +match')]", null); + query = "//para[ft:query(., '+double +match')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq); assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "double" + MATCH_END + " " + MATCH_START + "match" + MATCH_END + " " + MATCH_START + "double" + MATCH_END + " " + MATCH_START + "match" + MATCH_END + "")); - seq = xquery.execute(broker, - "for $para in //para[ft:query(., '+double +match')] return\n" + - " {$para}", null); + query = "for $para in //para[ft:query(., '+double +match')] return {$para}"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq); @@ -236,16 +238,16 @@ public void indexByQName() throws EXistException, PermissionDeniedException, XPa public void matchInAncestor() throws EXistException, PermissionDeniedException, XPathException, SAXException, IOException, LockException, CollectionConfigurationException { configureAndStore(CONF1, XML); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//para[ft:query(., 'mixed')]/hi", null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + String query = "//para[ft:query(., 'mixed')]/hi"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); String result = queryResult2String(broker, seq); assertThat(result, hasXPath("count(//exist:match)", equalTo("1")).withNamespaceContext(NS_CONTEXT)); - seq = xquery.execute(broker, "//para[ft:query(., 'nested')]/note", null); + query = "//para[ft:query(., 'nested')]/note"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq); @@ -257,16 +259,16 @@ public void matchInAncestor() throws EXistException, PermissionDeniedException, public void matchInDescendant() throws EXistException, PermissionDeniedException, XPathException, SAXException, IOException, LockException, CollectionConfigurationException { configureAndStore(CONF3, XML); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//hi[ft:query(., 'mixed')]/ancestor::para", null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + String query = "//hi[ft:query(., 'mixed')]/ancestor::para"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); String result = queryResult2String(broker, seq); assertThat(result, hasXPath("count(//exist:match)", equalTo("1")).withNamespaceContext(NS_CONTEXT)); - seq = xquery.execute(broker, "//hi[ft:query(., 'nested')]/parent::note", null); + query = "//hi[ft:query(., 'nested')]/parent::note"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq); @@ -279,34 +281,37 @@ public void inlineNodes_whenNotIndenting() throws EXistException, PermissionDeni configureAndStore(CONF4, XML1); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//p[ft:query(., 'mixed')]", null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + String query = "//p[ft:query(., 'mixed')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); String result = queryResult2String(broker, seq); assertThat(result, CompareMatcher.isIdenticalTo("

Paragraphs with " + MATCH_START + "mix" + MATCH_END + "ed content are dangerous.

")); - seq = xquery.execute(broker, "//p[ft:query(., 'ignored')]", null); + query = "//p[ft:query(., 'ignored')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq); assertThat(result, CompareMatcher.isIdenticalTo("

A simplesic paragraph with highlighted text and a note to be " + MATCH_START + "ignored" + MATCH_END + ".

")); - seq = xquery.execute(broker, "//p[ft:query(., 'highlighted')]", null); + query = "//p[ft:query(., 'highlighted')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq); assertThat(result, CompareMatcher.isIdenticalTo("

A simplesic paragraph with " + MATCH_START + "highlighted" + MATCH_END + " text and a note to be " + "ignored.

")); - seq = xquery.execute(broker, "//p[ft:query(., 'highlighted')]/hi", null); + query = "//p[ft:query(., 'highlighted')]/hi"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq); assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "highlighted" + MATCH_END + "")); - seq = xquery.execute(broker, "//head[ft:query(., 'title')]", null); + query = "//head[ft:query(., 'title')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq); @@ -319,12 +324,10 @@ public void inlineMatchNodes_whenIndenting() throws EXistException, PermissionDe configureAndStore(CONF5, XML2); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - final String query = "declare namespace tei=\"http://www.tei-c.org/ns/1.0\";" + + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + final String query = "declare namespace tei=\"http://www.tei-c.org/ns/1.0\";" + "//tei:p[.//tei:w[ft:query(., дознајем)]] ! util:expand(.)"; - final Sequence seq = xquery.execute(broker, query, null); + final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); final String result = queryResult2String(broker, seq, true); @@ -363,7 +366,7 @@ public void inlineMatchNodes_whenIndenting() throws EXistException, PermissionDe public static final ExistEmbeddedServer existEmbeddedServer = new ExistEmbeddedServer(true, true); @BeforeClass - public static void startDB() throws DatabaseConfigurationException, EXistException, PermissionDeniedException, IOException, TriggerException { + public static void startDB() throws EXistException, PermissionDeniedException, IOException, TriggerException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); final TransactionManager transact = pool.getTransactionManager(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); diff --git a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/SerializeAttrMatchesTest.java b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/SerializeAttrMatchesTest.java index 63a5a85f8c..0eab1e0ffa 100644 --- a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/SerializeAttrMatchesTest.java +++ b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/SerializeAttrMatchesTest.java @@ -56,6 +56,7 @@ import org.exist.dom.persistent.DocumentSet; import org.exist.dom.persistent.MutableDocumentSet; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.txn.TransactionManager; @@ -66,7 +67,7 @@ import org.exist.util.StringInputSource; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Item; import org.exist.xquery.value.Sequence; import org.junit.*; @@ -113,8 +114,7 @@ public void expandAttr() throws CollectionConfigurationException, LockException, final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = pool.getXQueryService(); - final Sequence seq = xquery.execute(broker, query, null); + final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertEquals(1, seq.getItemCount()); diff --git a/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/CustomIndexTest.java b/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/CustomIndexTest.java index db729dddb8..1e14715740 100644 --- a/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/CustomIndexTest.java +++ b/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/CustomIndexTest.java @@ -55,6 +55,7 @@ import org.exist.dom.persistent.DocumentSet; import org.exist.dom.persistent.MutableDocumentSet; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.lock.Lock.LockMode; @@ -68,6 +69,7 @@ import org.exist.xquery.XPathException; import org.exist.xquery.XQuery; import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Item; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceIterator; @@ -138,9 +140,8 @@ public void xupdateRemove() throws EXistException, PermissionDeniedException, XP checkIndex(broker, docs, "cha", 1); checkIndex(broker, docs, "le8", 1); - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//item[ngram:contains(., 'cha')]", null); + String query = "//item[ngram:contains(., 'cha')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); @@ -221,7 +222,9 @@ public void xupdateInsert() throws EXistException, LockException, XPathException XQuery xquery = pool.getXQueryService(); assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//item[ngram:contains(., 'cha')]", null); + + String query = "//item[ngram:contains(., 'cha')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); @@ -336,9 +339,8 @@ public void xupdateUpdate() throws EXistException, LockException, XPathException checkIndex(broker, docs, "cha", 1); checkIndex(broker, docs, "le8", 1); - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//item[ngram:contains(., 'cha')]", null); + String query = "//item[ngram:contains(., 'cha')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); @@ -397,9 +399,8 @@ public void xupdateReplace() throws LockException, XPathException, PermissionDen checkIndex(broker, docs, "cha", 1); checkIndex(broker, docs, "le8", 1); - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//item[ngram:contains(., 'cha')]", null); + String query = "//item[ngram:contains(., 'cha')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); @@ -450,9 +451,8 @@ public void xupdateRename() throws EXistException, LockException, XPathException checkIndex(broker, docs, "cha", 1); checkIndex(broker, docs, "le8", 1); - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//item[ngram:contains(., 'cha')]", null); + String query = "//item[ngram:contains(., 'cha')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); @@ -488,17 +488,18 @@ public void reindex() throws PermissionDeniedException, XPathException, URISynta checkIndex(broker, docs, "cha", 1); checkIndex(broker, docs, "le8", 1); - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//item[ngram:contains(., 'cha')]", null); + String query = "//item[ngram:contains(., 'cha')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "//section[ngram:contains(para, '123')]", null); + query = "//section[ngram:contains(para, '123')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "//section[ngram:contains(para, '123')]", null); + query = "//section[ngram:contains(para, '123')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); @@ -513,9 +514,8 @@ public void dropIndex() throws EXistException, PermissionDeniedException, XPathE try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = transact.beginTransaction()) { - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//item[ngram:contains(., 'cha')]", null); + String query = "//item[ngram:contains(., 'cha')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); @@ -529,7 +529,8 @@ public void dropIndex() throws EXistException, PermissionDeniedException, XPathE checkIndex(broker, docs, "cha", 0); - seq = xquery.execute(broker, "//item[ngram:contains(., 'cha')]", null); + query = "//item[ngram:contains(., 'cha')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); @@ -538,24 +539,26 @@ public void dropIndex() throws EXistException, PermissionDeniedException, XPathE } @Test - public void query() throws PermissionDeniedException, XPathException, EXistException { + public void query() throws PermissionDeniedException, XPathException, EXistException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//item[ngram:contains(., 'cha')]", null); + String query = "//item[ngram:contains(., 'cha')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "//section[ngram:contains(*, '123')]", null); + query = "//section[ngram:contains(*, '123')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "//section[ngram:contains(para, '123')]", null); + query = "//section[ngram:contains(para, '123')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "//*[ngram:contains(., '567')]", null); + query = "//*[ngram:contains(., '567')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); @@ -563,29 +566,27 @@ public void query() throws PermissionDeniedException, XPathException, EXistExcep } @Test - public void indexKeys() throws SAXException, PermissionDeniedException, XPathException, EXistException { + public void indexKeys() throws SAXException, PermissionDeniedException, XPathException, EXistException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "util:index-key-occurrences(/test/item, 'cha', 'ngram-index')", null); - //Sequence seq = xquery.execute("util:index-key-occurrences(/test/item, 'cha', 'org.exist.indexing.impl.NGramIndex')", null); + String query = "util:index-key-occurrences(/test/item, 'cha', 'ngram-index')"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "util:index-key-occurrences(/test/item, 'le8', 'ngram-index')", null); - //seq = xquery.execute("util:index-key-occurrences(/test/item, 'le8', 'org.exist.indexing.impl.NGramIndex')", null); + query = "util:index-key-occurrences(/test/item, 'le8', 'ngram-index')"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "util:index-key-documents(/test/item, 'le8', 'ngram-index')", null); - //seq = xquery.execute("util:index-key-documents(/test/item, 'le8', 'org.exist.indexing.impl.NGramIndex')", null); + query = "util:index-key-documents(/test/item, 'le8', 'ngram-index')"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); - seq = xquery.execute(broker, "util:index-key-documents(/test/item, 'le8', 'ngram-index')", null); - //seq = xquery.execute("util:index-key-doucments(/test/item, 'le8', 'org.exist.indexing.impl.NGramIndex')", null); + query = "util:index-key-documents(/test/item, 'le8', 'ngram-index')"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); @@ -599,9 +600,8 @@ public void indexKeys() throws SAXException, PermissionDeniedException, XPathExc "};\n" + "\n"; - String query = queryBody + "util:index-keys(/test/item, \'\', util:function(xs:QName(\'local:callback\'), 2), 1000, 'ngram-index')"; - //String query = queryBody + "util:index-keys(/test/item, \'\', util:function(xs:QName(\'local:callback\'), 2), 1000, 'org.exist.indexing.impl.NGramIndex')"; - seq = xquery.execute(broker, query, null); + query = queryBody + "util:index-keys(/test/item, \'\', util:function(xs:QName(\'local:callback\'), 2), 1000, 'ngram-index')"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); //TODO : check cardinality try (final StringBuilderWriter out = new StringBuilderWriter()) { diff --git a/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/MatchListenerTest.java b/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/MatchListenerTest.java index a8fc0aebd5..f6916262dd 100644 --- a/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/MatchListenerTest.java +++ b/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/MatchListenerTest.java @@ -58,6 +58,7 @@ import org.exist.collections.CollectionConfigurationManager; import org.exist.collections.triggers.TriggerException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.serializers.EXistOutputKeys; @@ -69,7 +70,7 @@ import org.exist.util.*; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.NodeValue; import org.exist.xquery.value.Sequence; import org.junit.AfterClass; @@ -157,28 +158,30 @@ public void nestedContent() throws PermissionDeniedException, IOException, LockE configureAndStore(CONF1, XML); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//para[ngram:contains(., 'mixed')]", null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { + String query = "//para[ngram:contains(., 'mixed')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); String result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with " + MATCH_START + "mixed" + MATCH_END + " content.")); - seq = xquery.execute(broker, "//para[ngram:contains(., 'content')]", null); + query = "//para[ngram:contains(., 'content')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with mixed " + MATCH_START + "content" + MATCH_END + ".")); - seq = xquery.execute(broker, "//para[ngram:contains(., 'nested')]", null); + query = "//para[ngram:contains(., 'nested')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("another paragraph with " + MATCH_START + "nested" + MATCH_END + " inner elements.")); - seq = xquery.execute(broker, "//para[ngram:contains(., 'content') and ngram:contains(., 'mixed')]", null); + query = "//para[ngram:contains(., 'content') and ngram:contains(., 'mixed')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); @@ -191,11 +194,9 @@ public void matchInParent() throws PermissionDeniedException, IOException, LockE configureAndStore(CONF1, XML); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { - - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - final Sequence seq = xquery.execute(broker, "//para[ngram:contains(., 'mixed')]/hi", null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { + final String query = "//para[ngram:contains(., 'mixed')]/hi"; + final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); final String result = queryResult2String(broker, seq, 0); @@ -208,17 +209,16 @@ public void matchInAncestor() throws PermissionDeniedException, IOException, Loc configureAndStore(CONF1, XML); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { - - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//para[ngram:contains(., 'nested')]/note", null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { + String query = "//para[ngram:contains(., 'nested')]/note"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); String result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "nested" + MATCH_END + " inner")); - seq = xquery.execute(broker, "//para[ngram:contains(., 'nested')]//hi", null); + query = "//para[ngram:contains(., 'nested')]//hi"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); @@ -231,23 +231,23 @@ public void nestedIndex() throws PermissionDeniedException, IOException, LockExc configureAndStore(CONF1, XML); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { - - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//para[ngram:contains(term, 'term')]", null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { + String query = "//para[ngram:contains(term, 'term')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); String result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("a third paragraph with " + MATCH_START + "term" + MATCH_END + ".")); - seq = xquery.execute(broker, "//term[ngram:contains(., 'term')]/..", null); + query = "//term[ngram:contains(., 'term')]/.."; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("a third paragraph with " + MATCH_START + "term" + MATCH_END + ".")); - seq = xquery.execute(broker, "//term[ngram:contains(., 'term')]/ancestor::para", null); + query = "//term[ngram:contains(., 'term')]/ancestor::para"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); @@ -260,29 +260,30 @@ public void mixedContentQueries() throws PermissionDeniedException, XPathExcepti configureAndStore(CONF1, XML); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { - - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//para[ngram:contains(., 'mixed content')]", null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { + String query = "//para[ngram:contains(., 'mixed content')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); String result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with " + MATCH_START + "mixed" + MATCH_END + "" + MATCH_START + " content" + MATCH_END + ".")); - seq = xquery.execute(broker, "//para[ngram:contains(., 'with mixed content')]", null); + query = "//para[ngram:contains(., 'with mixed content')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("some paragraph " + MATCH_START + "with " + MATCH_END + "" + MATCH_START + "mixed" + MATCH_END + "" + MATCH_START + " content" + MATCH_END + ".")); - seq = xquery.execute(broker, "//para[ngram:contains(., 'with nested')]", null); + query = "//para[ngram:contains(., 'with nested')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("another paragraph " + MATCH_START + "with " + MATCH_END + "" + MATCH_START + "nested" + MATCH_END + " inner elements.")); - seq = xquery.execute(broker, "//para[ngram:contains(., 'with nested inner elements')]", null); + query = "//para[ngram:contains(., 'with nested inner elements')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); @@ -295,16 +296,16 @@ public void indexOnInnerElement() throws PermissionDeniedException, IOException, configureAndStore(CONF2, XML); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - Sequence seq = xquery.execute(broker, "//para[ngram:contains(note, 'nested inner')]", null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { + String query = "//para[ngram:contains(note, 'nested inner')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); String result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("another paragraph with " + MATCH_START + "nested" + MATCH_END + "" + MATCH_START + " inner" + MATCH_END + " elements.")); - seq = xquery.execute(broker, "//note[ngram:contains(., 'nested inner')]/parent::para", null); + query = "//note[ngram:contains(., 'nested inner')]/parent::para"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); @@ -317,23 +318,23 @@ public void doubleMatch() throws PermissionDeniedException, XPathException, SAXE configureAndStore(CONF1, XML); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - - Sequence seq = xquery.execute(broker, "//para[ngram:contains(., 'double match')]", null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { + String query = "//para[ngram:contains(., 'double match')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); String result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "double match" + MATCH_END + " " + MATCH_START + "double match" + MATCH_END + "")); - seq = xquery.execute(broker, "//para[ngram:contains(., 'aaa aaa')]", null); + query = "//para[ngram:contains(., 'aaa aaa')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "aaa aaa" + MATCH_END + " aaa")); - seq = xquery.execute(broker, "//para[ngram:ends-with(., 'aaa aaa')]", null); + query = "//para[ngram:ends-with(., 'aaa aaa')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); @@ -346,24 +347,24 @@ public void wildcardMatch() throws PermissionDeniedException, IOException, LockE configureAndStore(CONF1, XML); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - - Sequence seq = xquery.execute(broker, "//para[ngram:wildcard-contains(., 'double.*match')]", null); + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + String query = "//para[ngram:wildcard-contains(., 'double.*match')]"; + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); String result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "double match double match" + MATCH_END + "")); - seq = xquery.execute(broker, "//para[ngram:wildcard-contains(., 'paragraph.*content\\.')]", null); + query = "//para[ngram:wildcard-contains(., 'paragraph.*content\\.')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("some " + MATCH_START + "paragraph with " + MATCH_END + "" + MATCH_START + "mixed" + MATCH_END + "" + MATCH_START + " content." + MATCH_END + "")); String wildcardQuery = "...with.*[tn].*ele.ent[sc].*"; - seq = xquery.execute(broker, "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]", null); + query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); @@ -378,7 +379,8 @@ public void wildcardMatch() throws PermissionDeniedException, IOException, LockE assertMatches(wildcardQuery, match); wildcardQuery = "\\*.*\\?"; - seq = xquery.execute(broker, "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]", null); + query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); @@ -387,26 +389,30 @@ public void wildcardMatch() throws PermissionDeniedException, IOException, LockE wildcardQuery = ".est[][?]tes."; - seq = xquery.execute(broker, "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]", null); + query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "test]test" + MATCH_END + " " + MATCH_START + "test[test" + MATCH_END + " " + MATCH_START + "test?test" + MATCH_END + "")); - seq = xquery.execute(broker, "//para[ngram:wildcard-contains(., '^" + wildcardQuery + "')]", null); + query = "//para[ngram:wildcard-contains(., '^" + wildcardQuery + "')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "test]test" + MATCH_END + " test[test test?test")); - seq = xquery.execute(broker, "//para[ngram:wildcard-contains(., '" + wildcardQuery + "$')]", null); + query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "$')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); assertThat(result, CompareMatcher.isIdenticalTo("test]test test[test " + MATCH_START + "test?test" + MATCH_END + "")); wildcardQuery = "^aaa.aaa$"; - seq = xquery.execute(broker, "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]", null); + query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); @@ -414,7 +420,8 @@ public void wildcardMatch() throws PermissionDeniedException, IOException, LockE assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); wildcardQuery = ".+simple"; - seq = xquery.execute(broker, "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]", null); + query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); @@ -422,7 +429,8 @@ public void wildcardMatch() throws PermissionDeniedException, IOException, LockE assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); wildcardQuery = "a s.?i.?m.?p.?l.?e.?"; - seq = xquery.execute(broker, "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]", null); + query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); @@ -430,7 +438,8 @@ public void wildcardMatch() throws PermissionDeniedException, IOException, LockE assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); wildcardQuery = "a s.?i.?m.?p.?l.?e.?"; - seq = xquery.execute(broker, "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]", null); + query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); result = queryResult2String(broker, seq, 0); @@ -438,7 +447,8 @@ public void wildcardMatch() throws PermissionDeniedException, IOException, LockE assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); wildcardQuery = "b.{3,6}c"; - seq = xquery.execute(broker, "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]", null); + query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(2, seq.getItemCount()); @@ -458,16 +468,12 @@ public void smallStrings() throws PermissionDeniedException, IOException, LockEx configureAndStore(CONF3, XML2); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { final String[] strings = new String[] { "龍", "龍護", "曰龍護", "名曰龍護" }; for (int i = 0; i < strings.length; i++) { - final Sequence seq = xquery.execute(broker, - "declare namespace tei=\"http://www.tei-c.org/ns/1.0\";\n" + - "//tei:p[ngram:contains(., '" + strings[i] + "')]", - null); + final String query = "declare namespace tei=\"http://www.tei-c.org/ns/1.0\";\n" + + "//tei:p[ngram:contains(., '" + strings[i] + "')]"; + final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); final String result = queryResult2String(broker, seq, 0); @@ -483,18 +489,14 @@ public void constructedNodes() throws PermissionDeniedException, XPathException, configureAndStore(CONF3, XML2); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { - final XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); - + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { final String[] strings = new String[] { "龍", "龍護", "曰龍護", "名曰龍護" }; for (int i = 0; i < strings.length; i++) { - final Sequence seq = xquery.execute(broker, - "declare namespace tei=\"http://www.tei-c.org/ns/1.0\";\n" + + final String query = "declare namespace tei=\"http://www.tei-c.org/ns/1.0\";\n" + "for $para in //tei:p[ngram:contains(., '" + strings[i] + "')]\n" + "return\n" + - " {$para}", - null); + " {$para}"; + final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(1, seq.getItemCount()); final String result = queryResult2String(broker, seq, 0); @@ -509,7 +511,7 @@ public void constructedNodes() throws PermissionDeniedException, XPathException, public static final ExistEmbeddedServer existEmbeddedServer = new ExistEmbeddedServer(true, true); @BeforeClass - public static void startDB() throws EXistException, DatabaseConfigurationException, PermissionDeniedException, IOException, TriggerException { + public static void startDB() throws EXistException, PermissionDeniedException, IOException, TriggerException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); final TransactionManager transact = pool.getTransactionManager(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); @@ -544,7 +546,7 @@ public static void closeDB() throws EXistException, PermissionDeniedException, I } } - private void configureAndStore(String config, String xml) throws PermissionDeniedException, IOException, SAXException, EXistException, LockException, CollectionConfigurationException { + private void configureAndStore(final String config, final String xml) throws PermissionDeniedException, IOException, SAXException, EXistException, LockException, CollectionConfigurationException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); final TransactionManager transact = pool.getTransactionManager(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); @@ -562,8 +564,8 @@ private void configureAndStore(String config, String xml) throws PermissionDenie } } - private String queryResult2String(DBBroker broker, Sequence seq, int index) throws SAXException, XPathException { - Properties props = new Properties(); + private String queryResult2String(final DBBroker broker, final Sequence seq, final int index) throws SAXException, XPathException { + final Properties props = new Properties(); props.setProperty(OutputKeys.INDENT, "no"); props.setProperty(EXistOutputKeys.HIGHLIGHT_MATCHES, "elements"); final Serializer serializer = broker.borrowSerializer(); diff --git a/extensions/indexes/spatial/pom.xml b/extensions/indexes/spatial/pom.xml index b60c5060d1..de1979155b 100644 --- a/extensions/indexes/spatial/pom.xml +++ b/extensions/indexes/spatial/pom.xml @@ -85,6 +85,12 @@ ${project.version} test
+ + + com.evolvedbinary.j8fu + j8fu + test + org.apache.logging.log4j diff --git a/extensions/indexes/spatial/src/test/java/org/exist/indexing/spatial/GMLIndexTest.java b/extensions/indexes/spatial/src/test/java/org/exist/indexing/spatial/GMLIndexTest.java index eea96a2d1f..5e7eeff280 100644 --- a/extensions/indexes/spatial/src/test/java/org/exist/indexing/spatial/GMLIndexTest.java +++ b/extensions/indexes/spatial/src/test/java/org/exist/indexing/spatial/GMLIndexTest.java @@ -71,6 +71,7 @@ import org.exist.indexing.spatial.AbstractGMLJDBCIndex.SpatialOperator; import org.exist.dom.memtree.SAXAdapter; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.lock.Lock; @@ -81,7 +82,7 @@ import org.exist.util.LockException; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.geotools.gml.GMLFilterDocument; import org.geotools.gml.GMLFilterGeometry; @@ -239,12 +240,10 @@ public void checkIndex() throws EXistException { } @Test - public void scanIndex() throws EXistException, PermissionDeniedException, XPathException { + public void scanIndex() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = server.getBrokerPool(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); - Sequence seq = xquery.execute( - broker, + final String query = "declare namespace gml = 'http://www.opengis.net/gml'; " + "declare function local:key-callback($term as xs:string, $data as xs:int+) as element() { " + " " + @@ -255,10 +254,10 @@ public void scanIndex() throws EXistException, PermissionDeniedException, XPathE " " + "}; " + //"util:index-keys(//gml:*, '', local:key-callback#2, 1000, 'spatial-index')[entry/frequency > 1] ", - "util:index-keys(//gml:*, '', local:key-callback#2, 1000, 'spatial-index')", - null); - assertNotNull(seq); - assertTrue(seq.getItemCount() > 1); + "util:index-keys(//gml:*, '', local:key-callback#2, 1000, 'spatial-index')"; + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 1); } } @@ -307,65 +306,63 @@ public void lowLevelSearch() throws EXistException, SAXException, ParserConfigur } @Test - public void highLevelSearch() throws EXistException, PermissionDeniedException, XPathException { + public void highLevelSearch() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = server.getBrokerPool(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); String query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:equals(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - Sequence seq = xquery.execute(broker, query, null); + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:disjoint(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:intersects(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:touches(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); //assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:crosses(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); //assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:within(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:contains(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:overlaps(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); //assertTrue(seq.getItemCount() > 0); @@ -374,14 +371,14 @@ public void highLevelSearch() throws EXistException, PermissionDeniedException, "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:equals(//gml:*, ())"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:overlaps((), //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); @@ -390,177 +387,175 @@ public void highLevelSearch() throws EXistException, PermissionDeniedException, "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:equals(//gml:*, " + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); } } @Test - public void geometricProperties() throws EXistException, PermissionDeniedException, XPathException { + public void geometricProperties() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = server.getBrokerPool(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); String query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getWKT((//gml:Polygon)[1])"; - Sequence seq = xquery.execute(broker, query, null); + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getWKB((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getMinX((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getMaxX((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getMinY((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getMaxY((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getCentroidX((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getCentroidY((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getArea((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326WKT((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326WKB((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326MinX((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326MaxX((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326MinY((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326MaxY((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326CentroidX((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326CentroidY((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326Area((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getSRS((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getGeometryType((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:isClosed((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:isSimple((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:isValid((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); @@ -569,14 +564,14 @@ public void geometricProperties() throws EXistException, PermissionDeniedExcepti "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getWKT(())"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getArea(())"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); //In-memory tests @@ -584,247 +579,245 @@ public void geometricProperties() throws EXistException, PermissionDeniedExcepti "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getWKT(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getWKB(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getMinX(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getMaxX(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getMinY(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getMaxY(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getCentroidX(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getCentroidY(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getArea(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326WKT(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326WKB(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326MinX(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326MaxX(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326MinY(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326MaxY(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326CentroidX(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326CentroidY(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getEPSG4326Area(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getSRS(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getGeometryType(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:isClosed(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:isSimple(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:isValid(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); } } @Test - public void gmlProducers() throws PermissionDeniedException, XPathException, EXistException { + public void gmlProducers() throws PermissionDeniedException, XPathException, EXistException, IOException { final BrokerPool pool = server.getBrokerPool(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); String query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:transform((//gml:Polygon)[1], 'EPSG:4326')"; - Sequence seq = xquery.execute(broker, query, null); + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getWKT((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:buffer((//gml:Polygon)[1], 100)"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:buffer((//gml:Polygon)[1], 100, 1)"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getBbox((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:convexHull((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:boundary((//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:intersection((//gml:Polygon)[1], (//gml:Polygon)[2])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:union((//gml:Polygon)[1], (//gml:Polygon)[2])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:difference((//gml:Polygon)[1], (//gml:Polygon)[2])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:symetricDifference((//gml:Polygon)[1], (//gml:Polygon)[2])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); @@ -833,70 +826,70 @@ public void gmlProducers() throws PermissionDeniedException, XPathException, EXi "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:transform((), 'EPSG:4326')"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getWKT(())"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:buffer((), 100)"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:buffer((), 100, 1)"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getBbox(())"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:convexHull(())"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:boundary(())"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:union((), ())"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:union((//gml:Polygon)[1], ())"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() == 1); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:union((), (//gml:Polygon)[1])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() == 1); @@ -905,98 +898,98 @@ public void gmlProducers() throws PermissionDeniedException, XPathException, EXi "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:transform(" + IN_MEMORY_GML + ", 'EPSG:4326')"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:buffer(" + IN_MEMORY_GML + ", 100)"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:buffer(" + IN_MEMORY_GML + ", 100, 1)"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:getBbox(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:convexHull(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:boundary(" + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:intersection(" + IN_MEMORY_GML + ", (//gml:Polygon)[2])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:union(" + IN_MEMORY_GML + ", (//gml:Polygon)[2])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:difference(" + IN_MEMORY_GML + ", (//gml:Polygon)[2])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:symetricDifference(" + IN_MEMORY_GML + ", (//gml:Polygon)[2])"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:intersection((//gml:Polygon)[1]," + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:union((//gml:Polygon)[1]," + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:difference((//gml:Polygon)[1]," + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "spatial:symetricDifference((//gml:Polygon)[1]," + IN_MEMORY_GML + ")"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() > 0); } @@ -1004,18 +997,16 @@ public void gmlProducers() throws PermissionDeniedException, XPathException, EXi @Ignore("Spatial Index does not currently work with XQuery Update / XUpdate") @Test - public void update() throws PermissionDeniedException, XPathException, EXistException { + public void update() throws PermissionDeniedException, XPathException, EXistException, IOException { final BrokerPool pool = server.getBrokerPool(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQuery xquery = pool.getXQueryService(); - assertNotNull(xquery); String query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + "declare namespace gml = 'http://www.opengis.net/gml'; " + "(# exist:force-index-use #) { " + "spatial:getArea((//gml:Polygon)[1]) " + "}"; - Sequence seq = xquery.execute(broker, query, null); + Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() == 1); final String area1 = seq.toString(); @@ -1026,7 +1017,7 @@ public void update() throws PermissionDeniedException, XPathException, EXistExce "update value (//gml:Polygon)[1]/gml:outerBoundaryIs/gml:LinearRing/gml:coordinates " + "(: strip decimals :) " + "with fn:replace((//gml:Polygon)[1], '(\\d+).(\\d+)', '$1')"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); @@ -1036,7 +1027,7 @@ public void update() throws PermissionDeniedException, XPathException, EXistExce "(# exist:force-index-use #) { " + "spatial:getArea((//gml:Polygon)[1]) " + "}"; - seq = xquery.execute(broker, query, null); + seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() == 1); final String area2 = seq.toString(); diff --git a/extensions/modules/cache/pom.xml b/extensions/modules/cache/pom.xml index cb361f9f14..2b629c9b41 100644 --- a/extensions/modules/cache/pom.xml +++ b/extensions/modules/cache/pom.xml @@ -76,6 +76,12 @@ ${project.version} + + com.evolvedbinary.j8fu + j8fu + test + + com.github.ben-manes.caffeine caffeine diff --git a/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/LazyCacheTest.java b/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/LazyCacheTest.java index 59420ac0ba..45519468c1 100644 --- a/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/LazyCacheTest.java +++ b/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/LazyCacheTest.java @@ -47,6 +47,7 @@ import org.exist.EXistException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.txn.Txn; @@ -54,10 +55,12 @@ import org.exist.util.Configuration; import org.exist.xquery.XPathException; import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.ClassRule; import org.junit.Test; +import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Path; import java.nio.file.Paths; @@ -81,7 +84,7 @@ private static Path getLazyConfig() { @SuppressWarnings("unchecked") @Test - public void putOnLazilyCreatedCache() throws XPathException, PermissionDeniedException, EXistException { + public void putOnLazilyCreatedCache() throws XPathException, PermissionDeniedException, EXistException, IOException { // 1. check that the CacheModule was configured from the conf file correctly final Configuration configuration = existEmbeddedServer.getBrokerPool().getConfiguration(); final Map>> modulesParameters = (Map>>) configuration.getProperty(XQueryContext.PROPERTY_MODULE_PARAMETERS); @@ -101,16 +104,16 @@ public void putOnLazilyCreatedCache() throws XPathException, PermissionDeniedExc assertEquals("baz1", result.itemAt(0).getStringValue()); } - private static Sequence executeQuery(final String query) throws EXistException, PermissionDeniedException, XPathException { + private static Sequence executeQuery(final String query) throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool brokerPool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = brokerPool.getBroker(); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Sequence result = brokerPool.getXQueryService().execute(broker, query, null); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); transaction.commit(); - return result; + return queryResult.result; } } } diff --git a/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/NonLazyCacheTest.java b/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/NonLazyCacheTest.java index c895354b53..e3bdefaf7e 100644 --- a/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/NonLazyCacheTest.java +++ b/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/NonLazyCacheTest.java @@ -47,6 +47,7 @@ import org.exist.EXistException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.txn.Txn; @@ -55,10 +56,12 @@ import org.exist.xquery.ErrorCodes; import org.exist.xquery.XPathException; import org.exist.xquery.XQueryContext; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Sequence; import org.junit.ClassRule; import org.junit.Test; +import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Path; import java.nio.file.Paths; @@ -82,7 +85,7 @@ private static Path getLazyConfig() { @SuppressWarnings("unchecked") @Test - public void putOnNonLazilyCreatedCacheWithoutExplicitCreation() throws PermissionDeniedException, EXistException { + public void putOnNonLazilyCreatedCacheWithoutExplicitCreation() throws PermissionDeniedException, EXistException, IOException { // 1. check that the CacheModule was configured from the conf file correctly final Configuration configuration = existEmbeddedServer.getBrokerPool().getConfiguration(); final Map>> modulesParameters = (Map>>) configuration.getProperty(XQueryContext.PROPERTY_MODULE_PARAMETERS); @@ -101,16 +104,16 @@ public void putOnNonLazilyCreatedCacheWithoutExplicitCreation() throws Permissio } } - private static Sequence executeQuery(final String query) throws EXistException, PermissionDeniedException, XPathException { + private static Sequence executeQuery(final String query) throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool brokerPool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = brokerPool.getBroker(); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final Sequence result = brokerPool.getXQueryService().execute(broker, query, null); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); transaction.commit(); - return result; + return queryResult.result; } } } diff --git a/extensions/modules/expathrepo/expathrepo-trigger-test/pom.xml b/extensions/modules/expathrepo/expathrepo-trigger-test/pom.xml index 2fa4ced6c2..3a9c33f664 100644 --- a/extensions/modules/expathrepo/expathrepo-trigger-test/pom.xml +++ b/extensions/modules/expathrepo/expathrepo-trigger-test/pom.xml @@ -94,6 +94,12 @@ provided + + com.evolvedbinary.j8fu + j8fu + test + + com.evolvedbinary.thirdparty.xml-apis xml-apis @@ -187,6 +193,7 @@ src/test/resources/conf.xml src/main/xar-resources/controller.xq src/main/java/org/exist/repo/ExampleModule.java + src/test/java/org/exist/repo/ExampleModuleTest.java src/main/java/org/exist/repo/ExampleTrigger.java @@ -202,6 +209,7 @@ src/test/resources/conf.xml src/main/xar-resources/controller.xq src/main/java/org/exist/repo/ExampleModule.java + src/test/java/org/exist/repo/ExampleModuleTest.java src/main/java/org/exist/repo/ExampleTrigger.java diff --git a/extensions/modules/expathrepo/expathrepo-trigger-test/src/test/java/org/exist/repo/ExampleModuleTest.java b/extensions/modules/expathrepo/expathrepo-trigger-test/src/test/java/org/exist/repo/ExampleModuleTest.java index 56c7b17a84..0a7a8a69cb 100644 --- a/extensions/modules/expathrepo/expathrepo-trigger-test/src/test/java/org/exist/repo/ExampleModuleTest.java +++ b/extensions/modules/expathrepo/expathrepo-trigger-test/src/test/java/org/exist/repo/ExampleModuleTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -24,11 +48,12 @@ import org.exist.EXistException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.test.ExistEmbeddedServer; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.IntegerValue; import org.exist.xquery.value.Sequence; import org.junit.ClassRule; @@ -39,6 +64,7 @@ import org.xmlunit.diff.Diff; import javax.xml.transform.Source; +import java.io.IOException; import java.util.Optional; import static org.junit.Assert.assertEquals; @@ -51,7 +77,7 @@ public class ExampleModuleTest { public static ExistEmbeddedServer existEmbeddedServer = new ExistEmbeddedServer(false, true); @Test - public void helloWorld() throws XPathException, PermissionDeniedException, EXistException { + public void helloWorld() throws XPathException, PermissionDeniedException, EXistException, IOException { final String query = "declare namespace myjmod = \"https://my-organisation.com/exist-db/ns/app/my-java-module\";\n" + "myjmod:hello-world()"; @@ -71,7 +97,7 @@ public void helloWorld() throws XPathException, PermissionDeniedException, EXist } @Test - public void sayHello() throws XPathException, PermissionDeniedException, EXistException { + public void sayHello() throws XPathException, PermissionDeniedException, EXistException, IOException { final String query = "declare namespace myjmod = \"https://my-organisation.com/exist-db/ns/app/my-java-module\";\n" + "myjmod:say-hello('Adam')"; @@ -91,7 +117,7 @@ public void sayHello() throws XPathException, PermissionDeniedException, EXistEx } @Test - public void sayHello_noName() throws XPathException, PermissionDeniedException, EXistException { + public void sayHello_noName() throws XPathException, PermissionDeniedException, EXistException, IOException { final String query = "declare namespace myjmod = \"https://my-organisation.com/exist-db/ns/app/my-java-module\";\n" + "myjmod:say-hello(())"; @@ -111,7 +137,7 @@ public void sayHello_noName() throws XPathException, PermissionDeniedException, } @Test - public void add() throws XPathException, PermissionDeniedException, EXistException { + public void add() throws XPathException, PermissionDeniedException, EXistException, IOException { final String query = "declare namespace myjmod = \"https://my-organisation.com/exist-db/ns/app/my-java-module\";\n" + "myjmod:add(xs:int(123), xs:int(456))"; @@ -123,12 +149,10 @@ public void add() throws XPathException, PermissionDeniedException, EXistExcepti } - private Sequence executeQuery(final String xquery) throws EXistException, PermissionDeniedException, XPathException { + private Sequence executeQuery(final String query) throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - return xqueryService.execute(broker, xquery, null); + return XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; } } } diff --git a/extensions/modules/expathrepo/pom.xml b/extensions/modules/expathrepo/pom.xml index 5b01f8c716..ff0192f8be 100644 --- a/extensions/modules/expathrepo/pom.xml +++ b/extensions/modules/expathrepo/pom.xml @@ -82,6 +82,12 @@ test + + com.evolvedbinary.j8fu + j8fu + test + + org.expath.packaging diff --git a/extensions/modules/expathrepo/src/test/java/org/exist/repo/PackageTriggerTest.java b/extensions/modules/expathrepo/src/test/java/org/exist/repo/PackageTriggerTest.java index 3cc4a38042..4c4bfed13c 100644 --- a/extensions/modules/expathrepo/src/test/java/org/exist/repo/PackageTriggerTest.java +++ b/extensions/modules/expathrepo/src/test/java/org/exist/repo/PackageTriggerTest.java @@ -48,6 +48,7 @@ import org.exist.EXistException; import org.exist.collections.Collection; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.storage.lock.ManagedCollectionLock; @@ -57,8 +58,7 @@ import org.exist.util.LockException; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; -import org.exist.xquery.value.Sequence; +import org.exist.xquery.XQueryUtil; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -111,47 +111,47 @@ public static void setup() throws PermissionDeniedException, SAXException, EXist // Install and deploy XAR try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = brokerPool.getXQueryService(); - final Sequence result = xquery.execute(broker, "repo:install-and-deploy-from-db('/db/" + xarFile + "')", null); - Assert.assertEquals(1, result.getItemCount()); + final String query = "repo:install-and-deploy-from-db('/db/" + xarFile + "')"; + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + Assert.assertEquals(1, queryResult.result.getItemCount()); } // Store collection.xconf in newly created collection under /db/system/config try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = brokerPool.getXQueryService(); - final Sequence result = xquery.execute(broker, "xmldb:create-collection('/db/system/config/db','trigger-test'), " + + final String query = "xmldb:create-collection('/db/system/config/db','trigger-test'), " + "xmldb:store('/db/system/config/db/trigger-test', '" + DEFAULT_COLLECTION_CONFIG_FILE + "', " + - ")", null); - Assert.assertEquals(2, result.getItemCount()); + ")"; + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + Assert.assertEquals(2, queryResult.result.getItemCount()); } } @Test - public void checkTriggerFires() throws EXistException, PermissionDeniedException, XPathException { + public void checkTriggerFires() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool brokerPool = existEmbeddedServer.getBrokerPool(); // Create collection try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = brokerPool.getXQueryService(); - final Sequence result = xquery.execute(broker, "xmldb:create-collection('/db','trigger-test')", null); - Assert.assertEquals(1, result.getItemCount()); + final String query = "xmldb:create-collection('/db','trigger-test')"; + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + Assert.assertEquals(1, queryResult.result.getItemCount()); } // Store document to fire trigger try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = brokerPool.getXQueryService(); - final Sequence result = xquery.execute(broker, "xmldb:store('/db/trigger-test', 'test.xml', b)", null); - Assert.assertEquals(1, result.getItemCount()); + final String query = "xmldb:store('/db/trigger-test', 'test.xml', b)"; + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + Assert.assertEquals(1, queryResult.result.getItemCount()); } // Verify two documents are now in collection try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject()))) { - final XQuery xquery = brokerPool.getXQueryService(); - final Sequence result = xquery.execute(broker, "xmldb:get-child-resources('/db/trigger-test')", null); - Assert.assertEquals("After trigger execution two documents should be in the collection.", 2, result.getItemCount()); + final String query = "xmldb:get-child-resources('/db/trigger-test')"; + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + Assert.assertEquals("After trigger execution two documents should be in the collection.", 2, queryResult.result.getItemCount()); } } diff --git a/extensions/modules/expathrepo/src/test/resources/exist-expathrepo-trigger-test.xar b/extensions/modules/expathrepo/src/test/resources/exist-expathrepo-trigger-test.xar index 3b45bde6e9c5ad33c770579d5cab1d75eb793de0..cfbd46ba012bca487350d7ea9c80c360c3291480 100644 GIT binary patch delta 23538 zcmV()K;OTgs{*~N0uE410|W{H00;m8eRED+kq#mad~;4*c_Co7Jy!q#w2?h8e>N^K zEmKZGP*X@xR4!^^a+JGctZ+@6t-HLQW!tvxXW6!G+qP}nwr$(CZS8mWx6e6W_fB_m zW>U%gapk@;}@N$&V0{FKF;-4Wcti(?vE+axG_Ya2r5BBFj zu#malxpF`N05f0!0OWtir1@pUe?^29m1w0!iWMepHtFHJpyv3l;N)!88EjoJn^-QE znwR^|q7m5`<;9W7Ct`iPDfo<5#|i%0Zmp}|OvO2>M5{%%(md7Fh*xd z!6BbmMY2qhN~$Gk6IlGoZabY?OVJ($+HEPxCg(`M-!)p+^BMR^bVK1-e+&^($d@eg zv(#64fX-QgDq*V|5@`{TboOgM(hmQNuUtSb$8WLJ{Q3%QiDdfJqUu;q&TVbnE)1(E z&*WTJU8}5U5ZwHuOW}&PZDG&d;E_YEqT5q?d$+UdEJ0%o8f@yyxKzNnskWSk-mNFp z<@Y9k5y~uPmh{yz7jis0e=oasBEkF-20gRF$I0x%Yjf8)cO}^}GKk@ez=oRx)Wes(#gU4`r-c*-`6wnw5e|-$i?@SRy2+O$U zU7c99nz6=kjOVr=t2z;ypN?B?!4Yiwm~ zZEWMDZ$)cj>tIRye@}1P|L9F)Wbi)}lm7o->|Za&Zg%=kX8-%UXq+6(O-+p*Xq=4y z&y4(Q*|`1FDzgnqBoYV!Anc!sh5x6Op{tqrZ4p{X}d!^7SbWC8$)B$;9CD8*AzT^#?OgIzQ?c zFx1^}XA`&C)40FdbE)Y`PuX2$Gpgj$l&MG-<#Rr>az4_HB6IMp)*j&A25}o*@V28QUWbp-UZw(u5z4nAM^RIZPtotuS|;{nE~o zFL^3&fA7CDFSGdBLMW!kpvt%W{YmgP?~^D63Dlxe6b$4|;KkHKe%)n_pE#?gg+)zf z2^`H1HPEqTn-&L3c}pR_1@Bo5W=o<00 z6bpaCeZrN}foe-O8_4`^u=B9aRFi-k81k8V1z|WCjxbvSxLU*Plk8VC%-^U4fs*XIh*zr8|03~VM(UVf*b(8NfBtZIalSWf#-CkX+yzv6Xi?9f16_P;>{~KI=0u)r z`HCYRNFGL{h5~n+8JW@aiBibp z1#i-IdUNs}-$pY|+etc?C`YeWB&(xKxivx?H(V6KD2Q$}>^V-MHOTzR2p+rwt^~Y4 z(R-C$VFV*-bxnz@E4EOrCEi3MUzCNE5^(jnKx)YNwe|27ceI6QLKv?05 z5Lr*tr!=%oKla-a3+PbC^|-Z5&I(Wh=&v%_5in{W^$04(r~y#R{ggu$Er)%BL_NVO zv)L4gwb5XY$?L;DWIK`KqAt^bOd{|=OC!%NzAD2cSjU{ibhYe*nV5>rt(7iI<||Bi zS21dI#?<__!mdwVe@gVZOQt8}SVvOB9z_O`NpPCIICkIzlkR_(cYj=E3chN<;RUY_ zibg2#4t95K=vL=tMo=!+$62?wX@K~Qu!#^?H2dVI;y}qFe_O~=Ks2gX@{QWn_mXGh zx^D;4EuhyqPyNf?)w;j{=i0&P9}-n-LmGFjssNWve_jF^f7|3ilxYJZhh3DyQi;(E zU+&D!Ib1Cgu#AN_)Lq>~t87mE%(f4?qi*(j$NEy*`m>o1SG$$EPlPa(%KvM3CQrNz zFC8+W|ENGAK_^6mvL2S)D<&Qscih0~gGj8n1Zy1~MKvNr(K{a!y z)ErCIwL)HmSXr2laO@5vLqYfE!ID^w3lAEt-u`IS!Jt2pBe$Ji?lP3{I zmwPC-?~7cO-3d>=_wI%zf z#6?WPQGcWaf}%Pcl(M^ox4k!63VDzUE*~k{kQZE;+g&r=r$p_|# zAbO-#f3v@&yntvnzBD?2gCH#Fmw92xkX2_|BPnDS*3PG7Qom*k{I43Adl*4SxdH_* z>5tdEX$%AK2@TU_xIS(gW^RtYfN$)UX)Mt!fwziLqeL3Wk+cWi=mB~boeD#dEiS4# zHMP0kq;%z8y}YYxUV7N8MxIK!D4ku@McjyVe_S(#4m)YDjCr)AjpKiD4?D2UK8lG{ zwr=(VP}wy-r0A$(@7N zefv03^I3oVdD{SfL9=6`H_4V%NWaazJ-1CBeK!v7=fbYe1liB*9&6 zPqnd58G_{|-I7N$`sI({rqQ7&aJKMAbQoG3(e`y_UkT$VXgE>3ToAAm9n9ZQHp8Ec zw&v=!*QEp42nt}@ZMOLQU=%e#EJ#9Wf4*=&wCAjGMj*|UISZ(Np_dyxy;l!@bmylT z9t3V;%kp`BOy49FZzTi1ijb9Qw4P6QS14bsej$zKMcrdY@0CH*$1#JE;ZF;Aubzi=&&t=GJ&8R!g6jYvSexsJ!a;7oX4arn&o1$ zh%*oZTGLBQq*(l3s?D{?$i;S15h4qWK-UmrsX#2ulLoHfTYxg4N(>T*=kssV)R{?b z<)KHxf6{7JIks}$dUQuvRSRHgf0`I;^7LfvPoQ1x%$Tu!yomd0Oe}RLdG{~;+Hq=R zq*jyg{f;96qcx!)DM7usDZ1Cp2OAss73VF?P!_~m?ZC*e-h<0-5HoF z0{*yJwW5*}#y=fmo|T1&>T{;r#=bhPU0~l;h_KggCgvt}T#!qrpP80=qefwT^L~UU zP?O}`n7i|?;?Ety0ga5mz+b&&3fd>gV>o;1?v;TafYhhBQ~JQQtq80Di2AMABcB1Bd-!LzGHsnIF5U!JQ@bqA-> zAkItFEM$z>_&8xVe_=RyCOW-+zFL7$qRv7$72?p8ToM)4fHrE^u5kTxQlOTwYe}CV zVU$=g*drz<8BP_Q-?FprVpiOGX>VJMYL|5m1Xa)Cx0OgR1unhF>dPVb4vDazwKa&b z&o?8QK`Zio9*PFc?L^`k{`9K!x}-Jnezvv1iR#r)q&NE$fAq0099BV#&-YrkYx(Cv#%xzLGmvT3k2#1NYyQ+QA2;;k3#k}FvRzYDSx0}RH8z(|va zkEZL=A4D9>qbx8fpDN9N3ps#J{sKo>9sb3zjZx;+=dlVeYUgOL zs3qZx#K5?fl6nNC6ri%o1Oj5s&VqxTB-~62{6p#AFeu};&o({>$P*)psQpE^z?94P z%}t(Ie;9MlwOlgZwzf6vXVF6NAyj0&p30Vy39k-nE6y5SFlY3~!D@DroODmJ%py_F zYMGjjjXNb%-Q4gV0g)q1IEoWql?;BsQT!5TNYXS}m{=VjUO$}aCb^jk*kxfCU#IK3 z0;0enG}5Mv;E&@bS^FQ?=>iv$+Gd~E56%CYoE*llymhmOFSBtNTa7|q;~q)C zn(~_m^r9sZg%zkUac%$B01a=`_sh%?f9#CUy%=F!$dH<4QJBnaiW!qFBQVb_PEwy=;7~jSE#V*!lwpCnh2t z06k3Ey6|Ni$r(m&-n(5f7B1UfaR%I*D-3hX!$Dwgr#hVKBSrCaqL^t#L}{b+d5T?7kj&y+!7-zD}19 z6+%0z)mG)4LT104v}WBR2OmfVRWae`DE&T2@iC z**M+ww`*KXOw2wEVWF)8?Yi3wO-xz4jxX98^q$;|oHDJz%^5i@4NZ?~21DDp4~0w? z*uf{|DX+gy#)Lz5g43hao+!K|bHQ?EUMqsQF6|z_iUx#(gOf=#c{S=w^5#Bzw;7Na z{fZV;db+Dq2w5dXMbtd{e~Aq>*&ro7@Y({IU-p5^K~%MS{t{KzugISKPR9sEo5*vk z_z93;8OQl5CG4VZLd-Hd9o;Ry^{A)<3yQ~;N&bMljwjkg{vk7lsa!B7e7NH2L_0O* zc?&+swVkEbamXxDbuTJcXK3!OB#jUZ{YD0w@CFO2Px5xnP)_h)fA&s`T?ZeY6BrS+ z7b~qy*YT--Xytya>lFs88M##9Rpp!SmR=AVH z&~dcsMn!dqk0vp5p%^QbXc9Xp`^@l;pcrQY)qq>A3#wlp(EEYHE#ETo*J2mooeZG; z-LYui_dAJpPmDYle-nWb$j}x9#EyVX7Os@ZIu#G4o)S1G*8=?QdL%upzVLR*%-}ku z$9vUu8DA*8RtOZ&;dq^S_Uf0%oC8NT`|MVIfDF)&fG8f!m?!eIRJ?q>Ps01>T!+&HLriX(`Lc z7s2A?71=@`SLxy=_FCpgMq97cQu(j-<5xTBTwCu~+f6_RgW9)@U|k{hJgmo1&8J@a(qeD- zu8dSwNWf2>Ril&CWRBx&>OT?gxbgRm7UcI>XP0nKdx9c#r1(g?7{}c;XxAoEwq2WE zxwMQ-&s9HEiSoozYs0|yf|3wOyoSo8^l{4B+hc|Vf1i!Qdo<#@ESvt-wQ9ZJ^Xw65CJa5nD0+%Oj!y&y&d3NYtR0*dhtZMg~ zYy{QO$^s4*E#Y7j9r?gf|GxKS_n9vVe$sBHMLS-$&l#6z`?n&qIhV@R&vMm!CNffQ^+ zVAAv^e#9z7jeFb(-TH?T%wWk^PYH%qWc>W=3~XgPRW}aEGo> zP;zU=cNBt57zj$8bgO!&>2kEYe^8D_U_suWvUAeGyJPx4HU)lS?KqIMW`*i1EhHIPcF1rGNidB3+#=zzK~_1LE)pa`i82odR>JDIYC4 z1zl{o(KJo7+HWU9<2_vxe;wdkOa#q^lL&0|?BCNk5%rH(eh{1LqwM0P1g;>wO0ti_ zxj`(cr)oO?w8Q*?C4?Yn2*xXCr%7EP@5$9TfV`q-Z8}?y@$qr}wP*e}K{eeR)?{B* zTQ3o^wEL;PkQcCydA40ml2cYuR;3wEgKn>Y5|8A`m_!QJ&z)PUS_wf<*aM+^Y-y!gl%zVX~JaR%Eu~LbHX9qHdtf z=9buwlK2?0!LJ;1e+y`;fYD`6ihZps^%r$8EaDvE79g%>`ThObnX#tx!UNmbqAZS{=nAt6Rn^VVRIWU$0d?2Q&06C6+$|R ztaeiS$vnh}(cD+rTmI-_B^YfAYvcpquh}dpc&X(5E;2}3VD3pesIs&~9As`!jdmu% zf{@c@c{KqPCjy2);_%8A+>rf1BwNeiqW`)p5c-T zyw)uYOk4qm3}VuiC*v41LhYEIR`ev%rXw15+= ze3_O(e?5sMao2(au?|)T)0znQ{W<|9PQIA!gt>7I9g~_<09t0AGUT!hfN0I+lw-ZG z;~lr#^L=NRXhO7XyRY`k0Ym(KhY}rEzDaNci!;y&;pp4dzhpQ}RAH9F*QgbNc3T2R|`f0t`YwgP2>t>zV8J-9AajhXWv>w zfALA{JflPGZR&WPa%1Su@QWDhypnf%D&ia2#F%OmM(a)7eT%sML>Elarz>(DTH&z? z`;H}B3Za)h&RF}C8>hh`T_2-5XWbynykYTFo7vSxeS#_Ou+1pLubd z|8-P<#b|9ck+!X;>Vh$%e13F$8ihO{Cpv8iVEau3mMo+^r1I*$O`j?Or1^|EV^ z&@O$q@L397Kvzg1wuRDQZM4(he{`*4EvlU5wK{80b7q>qS^Ns_2r^PCsnU{&caMK@ zHY%m&@|qF@-ac6b=H!au{<9K(_1kSw>9H;>-1;2LhC+R{!&32d>Brmp-M;-cB88MH22~22y&D>i}{3vu`3exp)p<|DSSg9P(fAfSr)zdOv zv9-wd$&Le;$wRe_P4gY`&~Vl_pKF6BIUL584nxJo;o)uvH_DvCx%cx*u(^NUHghih zabH8Hc`&B#W8sOltvGa9sz{U-lVtd`AEB_*yg4p=$Y z3FM+U6~ciVBg9}{w(&8g9_mGG;elB0e}M%>OJQQ7@7JQ&p%tPLW)ExD)4&K3^q52l zjdkxg*&$z{R;Uf2pEIzjP0#%5sGAm(2-|tA!ZC?H&Ab-`pNALAe}LB{*k;vZM;6T6 znf{Oyp|5wNLuh)4uO)(!p_;=$L_T~$2tg;u&*{)GZOrKSh?5w3i#BEa8_#}1D`*z> zhyW!ILa7Xeg0{Vn4UwjN=qG)iR-PBrd*Gm*4TfG~#+z#iKVb0Zr6_6vi<#i-UT2WJ zleALz;y{zr32qomf2FXSu+QjgEduOSGbp=7;rc9XxYnd|MQrRRGcimTe|Bq2#IZ4_ zE`&d0POlY_z}VOg9jUOp7lvhbWY_^NBoL%cr6e8d%vz~Vp7V7dGrutg=Kfa!>0L=c zRUGuv1jrGHj9I2UHjyV7Y$N!FA2&~ZOLcBc#&M#ie{$vKsh!q10+t5=Gwk?* z!2C|3MsY&5xqIavY;gkJa*x@E#jortCC$3uvjCF09wmcRO~l#@G_M=f9Jv@oXkzyBB+&xJ$@~teU}$1 zd2i6VaW*XHGx;kO93*?Z&?F|O_L42c!rrO2ymtAb>;WWK?cE3brc~F1Xq`m{Nj0<= zQFx{LA0zC#IZreW`SBwv!9hXt@YzZsuJYVdOddIt+nvm*5Q*`(mV?^$5e``Ida5#A z58#XEf2~YQC2UFS8;czD={wVqE*%@|!e~~PwW5(Po4sHcE)2@Sc1M#>XF-yee>Q*= zBB||A*9w8YqCiwXLZLHMWFgpGSf_Irn7}%(EjRD=NLY6b_K(87GjpW-oVzb}?kb6! zt&bbZy_rnr`Br&NjKQ>D!RVScWpC-k2`Qr)e{m`BP=d-LfvNb;sv!3uTKk>8ZQ$`8 zTY`D@&tf=ADe?kg{B;T+;rqHKB~n5l53^7Y!DJ6u0o)+n;<@r)v~5&^co0xEh1N!j zZG<}px>i8AGB?$3@C8H8Y4Uln{k8BSg0d%{liKoOLSK=@U@&6?Em)1;xrbP&P+9Q2_gbX=DmGL62ieK;6(_^=Q zDbm)>*38M;>fd5H z4(5dVyb8({K*G*{io`(R(MhmZU(jni+^V;o!+yO-UC6^TB)#u%rn=aeY)wMZa#k(; z`8-lq-0j1RWiVJf=n?b@vb+em`DX0tvi<}YbGlVME{u6!*s=7CNY}24#x0}|f6{4H zL|dmBr<~{=L1S;<0E1~ z4@WUGQe*RThEd;GC^BI?Q71MqqN+=Q#Y{RH!J=}O)4@g3oEXu3;*t{)A*%?N87U2( zG8RlB1_|q^TT3tuG>FJl8nD_9f9q9n08SP)0*W>Cj{gdbG{CTB|4xK9#+SA-5YnmIUosBt8*qOOqI}shX9KjCe+QgUsYx?o zN+wyns=l1*v20I&Fe|S;nzy7l`$Eo&oC_~ZJ${!t^%nw7#0?z;C_hX3VnVIkB~XY^ zx}rh|4~nA*;O{YiPPvn3UYs|fIjOk(q~gq1N9M(LNJ@XRou(agT(BCcFPiSFXY~m` ztKBfMMgd6ECxVcql2=Nif4Qu+QGU*VyEA=yPoH}qJo{Y^TQzdnEMVwvQV;c7Gww3k z$$Qv(DYxlK5ZFdPJoJp=iwD#k_-I@Emp*;gy-!^iC@`gUKx5mrh5|_5W0slXl{_j*>?v59l$v+ZRfd&8|{J&Fm!fyK3c2>sHwnolY#b=iAq&8pjFId_@;6hB{Tk19H;DO+xus1XQSp; zr6t!zczJjgi>=@ye?MBx&KFXl{@bmeJGZYd-L0|Tm$$pWAaQ-Kz-<7rcsua41EY4` zHYy}NrRpt44aDvDVWAUm{zgx)3^6GmFlbSzZLTxWG#;-bZk~td1R_>(90P6>`fC2hK?MH8 zv}FOV*KoXbC%{PKE62r4gxU*cPamcUL z|4E3eN`V`nfAZR4p+qvw%2J4Vs~e6Q*cNi>FITzk#twnf6f&Fa2P%qU@(s{VBC?tSQ{mGx!v zN3m@f{)P)pdC&ILy{<9mDky=6Hv^BCkGFv9$Y(nSf0~+)5L&Sm7TSu*73OD3e9>QZP)QnZrj@jX66d(tbdV@^UV z&^gvC6I)t}lLeE(#~#AVkrm|-?cHb1x@O435bs5-QaPYlqQj;TS2h|U_cm4)ldL}u ztrr8E8gYgANZ$iep%OJ+gH$eF@w`u}bMyK+e?mW0S_lpCl&!z=O4?sLPJl!%j%9n`k7v2%)2<#>RiBm7ZRpMvxFd ze{qy9q#FlPnNN3Iw~y5k@VAOY)%7$n(4$9_VO|4>AeA19sm4FB62@%0SC;8q(D2oMVK7Y2ouKxWvOFIg1oRy3o^H; zq?o7JllSJYBaJ;#g&8nI;>fz4k(p}Bf4yaq4Ex*iyKUS-Q_+?Xb(dh(l&GUE&g(3m z)|7CdE!OKSHbkDsKAlapN=qi;(nS~g?n#()ayx~+n%oTQ><8-PRRA+@D~wPcL(Np} z8Ocl`S8?d$4J#stQ~!<4dR8t=n zcl0Y$c)-OkNutHw>v@25eDZ!`T9YJ82=GbE`zy@AAIvCBH0T;*Is5xxb}4>zlsMdf zPSGGV005Hzc9#-yw)v0rtK+{ms%ABCH>_g}A79Ov@rPl1A#8f0_-ucxQTdF&5;Utr zR6_kOA&VfR#rxE{RwQKE4xA)1e;C0nPOVPzd6~2tdDi4htl|W6oD@knJm))+DYRz0 zzcLNSXWSEyPxpmezPsMPY&*7JySbscy!L#4F7haUAtX@Vl#=qb^xDm%g`Vn#Mq;9H zW-eCh#X?iWhgyvk?YZ}3f6ry3ikP`9 z&*wvU0N>>E@$(80EBYeNrBiZPiM9XCE*nS zD(Tk;SfEJ4BeM?%ivBH5!)2<$;9{OcRg+K$Zzj?hno}T(_t}&v5+OIEut26(v?rZG zEaT1Q@8hd57U7!KhopvKe;fK@*UWQJVuNmcFEhs&R2XQdoEdZwD8-wx0OKixKr7qe zb&`wSoDcE#2?C*H+^9D(?ZtaeDu;oiQX`Sm4LU}c9=qV+dKqiRvjmxV>CjLmq$b+H zuj?n0*)}wnoHYtFZCW$ONFc3Jo~tszAq3(NC9x!n8hdGi4lwzXf0PCeGN2Rlgxn}< z9G6>c0L+TW*wLo!K|Y80V!+E&CeCB7*@1h`c(`7a(_knSW=29gL<%~qVvmr+L}YDp zAUO4`l(jF9n0{ll!FvK?k?X`zQGhZ_V$vb0i~7=}ZPB4NY@z}+fz*;?W!e!mP#V}*GzIb(l;y|%>0lH(%#q8PS zNnOK*KSsP$a-i@8FCseT0_Hn?)t{>_=<`&*7K39mExp{6w5M-mANxlS?E~dX<(^wT zc(_=uDY#fd`g$cSkuKYW)fjyJ=B1(y8u$uJ{5o!i7G?FSe;Xq6ICEl6W5UEZ2anbT z|Kxm$}l@|{OO8saoh-AMxPlGRRf=BeChcbUCx{yS0ICJ2|pG#IJ z)s>GrQ(2cVe?xJig!vJ|YgSMgV{0BH>o8CPz49@?%*iIF4LypQH2DZ{hx=?uC#95I z1QbyQk;6pH>NWHn$3Ro#&wGLO7^}#h^OPj_}--J^!$Qt9{G*Z_X z3zeQ{u_~Ra0}{9LzxXq78e1zgq?;VU4N$J|$nEFGf0R13g(!21gB)%o@5z)pB;(1% zr-J0?wet5GT`^82KTc+=$l38Z*Gm1DpqSi1t&}F{A7Li!bf7r?wxnPeK77q&+ip5A!e zY6D)&-S~L%?QW{N%PVzRXR{bLm`2~@cN-@4XUKw=M!J6Sd5iX3P+a$BFfJfNi*+2? zE$Q7;vB_5MIMj*1HYiQ+N8$OBHqT~NT&KjTQB>GZ zA25C?>!AIX9EiJTd|EHEv||41jb=RyD4ZpZ`gOHo|3dEVx=HjeI$Zp~eLgWO5;_lY zC#CMg9%!UsXvhGOsKkBu!mUF8-05xUVngEard~16n!W+QeReUlvwMIZMwz3 zQT&yx)B0skQ3`8trNT?Mf8$b^apLIhSm%O$x)q>Yoaxo7@9t<9{HSr5SR0uc=saWT zzD}weed{s`uXW6e?KyjFo81M@mNPWrKeBfLk;MmrS^wjvcplrtM$d5Ntmxz|J-Iloe*||=MI|Lxu7~7_OqqixNbW0p__(p5*32%Bp;1%06 zD(4^Cu0WiiIL7CHdk7BuAiEd(hVcEvuu4f$6E#Y4NLI9je}}w6rAAp%K{>0buw9xr z-V4d+Jau>-jK!u$e>6z>_}3-@aK{-j(CG?Six;rk^_o3oHAiUqubmSR_%M5d=PGM< zpT3+ltD6fP(bVK*$hR*yf$^NC_iInLQp@I0b=WR zG#t1p$gRVUfA{PDjsL>lXys)fQes={?z@+69qrrSX9XWxM?T*M5A!?4#5bv5Kf1T~ zuMPe00BXzqv|j%|^;2nDSmtXUN{58hg2=Zn1@h7WQT}q%0HC#0?52MnMz|TjCR?;yU(1u7 zTH}HL4vgnVmMKJzb4UK>C5cjN)5~gqBqzo*Bxasi8?kpx@$gh%2?Gmeq}k2R#m%)Q zG4(a7m4y@xtfhY#2JEGX+FUa@@OFuw)vG~Ff6$0^$#zxbxBPTnvm7w(kQN3n=p()E zKmuZ@SQ(6YV0c|nNy<&&MHyyTnbCQ%f=F9;^KK+4qE~iG$%cmG7&Iw}#N)o^Wj(wP z1{#%G&@duui85xSh(Mq}&w=CW3@wDtrjtw}eQz-fp5Py^@&FRE6uCky!IB^pP@!?P ze|28BxRz48XSI+?BWhJUj+!_-ca5+(449!aBwodxzLBIo?WV+_k2(|E6(S9VuHhte z&VBQJ)DA|o5hog@*km=5LkZBzdXa(Pc0`56JoB{*n;{bFiKRS8wPugzOvDU?r47wj zcYBoX&cOwdU7Z^kO+I~n~~4kcp=4#=xv7Q~Yp z#nn*6`7<|1vF2rGK<94w?`_D9IT?cXLc^^UawBQU%fF$q`9HXzm-f{`kp&lFE9RK| z%RAMZgI*Dv75a(K5d!`3y~G6ufdQ~ikc}k5sdXiLJLcB3OPfV{OliPqa%(bdf6K(w zvkodIh$Zdla@uYDBPyWVgp?VQ)_G+?1Wq_D`khfYkUNptAdSs4upM_I*m3thpp;hul4) zQ0ErAZc>-aRq{MyjV(t0Lc^Y!x4`XLAW-~?3`O`+`_#44z2U{=NKU1wY(#|vYn9=g ztUiu^9Vf~$DV)ZTJv*ZUr;ZZ7bmS&QSWqL+`i)AUYFYaHD2Ph-Na5R>f31{6w&ILM zN+V`iKpQKM%#*ffCZdC?MHN0fqtpg&SddiYDn+pi3%+p-3e7Oi%&yV=8EW=Suub&- zxLPPaiw=aR0NLxuV)*wk6m|>EIncnXjsjuqT^pClb0!3jX}2l&gA2jc!iY?<4<3^r z(ptCn=udJN!HSgKB6x}Qe_OX@Zm#S}&@}MM7B3 zZ`>%@vGGdjO*cqUl}>kLOO5a#0+F0VF8S@@>c$?vmD$aVIs`d#B*1*}vfgRe%gF%0 z9v~rasLz_yy&eWd$x^rhz)7@KtpUszVp=$al^JqM!ysEWdguy8e~&7Hmab6~9qPM8 zAcCbuG$j!jd5H`tle`oW^=H>wa3%(K)@!mgS%;tHnLI>Pp zuT_k3=P*YKD7Fh{3ztSs(D4(RD)u*wGO!&@^cF~Qq+J;3f2GK=%=Ont#!RGDt;2d) zCqE`)O0Ixn?8fiqs<>j*wyC&SSk)vus-mG8+{{}o$D7OhOP{y)I3<K5|v3lCtr+~$E0VWl`0 zWJp7MNC#a`=nAUge9?k`c-y6sTAUK)E78`(PGy-je;8GKR}kR~x4)=&i_jZ=N88~y z+kAKT*!YEtpDbpnniKGZjaPB^hmU7`*z%s74JZub_-xPj0qD|Yw-d? zi#c4f;t{_vZLre;vtd5i%839=du#+K&h#z;f0*Jsw74+Fb_U6s0??a^bnXK`BM8KQ zDT63T%^gd1C;scA(*x+%qEg&GtDkeuYPET}=3rt(T#Jsu$AffUGn#d_Li`G4{;>xF z#G5EFOeJ4h$GN!og=FaU!%~J|KlM9DJj#9VwJRd|;2kv_lDT!9Iz%><%f7^?%-sv~@*e^Yu0>b& zbzH_=%7MC4#z;rFZc#LuEEQXL-JZiu=U5$5gT34HdOeHX!!{wan~5zp$Yngs7`EQw z2X>g+8(F;t=$T=>{ zst<8!Cx;lSej zg|rZycG5V(4foRC{D&9qAwA@tiAoG&BXUA4`Z#R1?=75h>z(|aD+m};K}xRPuSrom zDUtzSfEbA0K`k;h8K>DINg6vQT)^6@U*9;}@B;0QS!eCxP?D}b`l}Bjbp3`(wf#!J5uy%LYul?aP`pWrZbwo) zO=?<2t`uW+jyTku<4?gOk5By3Ue~vbT^Kl+CxElq=*MfX7*j?JgLgH7jr{dP89p=Z z;Uyr+er_6w5rN{g+%==JPGX>)bMXt>t6f*!liF6&2^PH#hXT129S2^~SsEi7rY)O* z&gYZo+!J#6r_I#9EsPtCFnNNSAGQVzxG&fcyWnlpV8w-v56Y*2>B*Uy1 zEQAk;#_!+UK{XQV{m9{yNEpjU%y}MBI=taq-$gCRJ~}jxRQg9DhS~q@eMfZI*GE$f zjD5x1$bu&0(Ntl%nTqrcd{UtxjHB*Jkzv;V{8OC^VgJAAUC1%)MQ%Z%Q)qR9x z+nJ(<-Z&gz$!MQ(yjik;DpH)8Qk`-y1S20|s#d~fU-*Wdvhmy}{?RFlC7M~@Q`(7bH zx-Zi9Ti_EuM=iuJ2@UU)d%n6xSpvg-plD7IWAJIsq71zjF^-JB+Fy#!h#l&vpYRJt zko^q63_UjiQcBGV-xaktiu??!|D?)hTx$vH{eH4iiW+rq2(ht(>(OW$on*jKg!U|I z>;v9|LVF@Ml#AZVdECwikE*Lp$uu%R-np1ytf%&WNXI^;HVEI083ncZ`ktxR!^=)i%?nFR)MgHVD7%+hbCYyc@kQTm{ zWyaOuF2=COCRAux8byB_-%jf~ol`x)RA3sX!|u=!w=E~eY`v%Zi!MK7)_3m^LQi>& zLWfDORJmd;5zdWa@iWM5X;c6EsN7K(?IOj`Bxkq|WrW~bFMTd+>mYpivUlUlVGdE8 z33y26mRF%I6R`bOcqGj(OS?mY$>`x{pYw{cz^7jCaL@U0Oznu}=qxOQ{R|Ak){0!i z{w1OKtNr3HTQeB&NbZ6+#jSK(5Lqh5XWNSCJy%!Vm&1Y@B;ezAq3i90hPU>g%fdn~ zu~GhjEL8q8PHDLt>4ESWmdq;s!P?)S=T^B`q7OUP=MPR*JlYpegSQnBA~e(5V?98p zc~QPE&tyHruh+W+BDE)J7sNG~#IxK3(`|nwSAK=t5Fi3fy(aW?UXv43gk+H$KFj^^w4ONlwBcR;S%t7bmE9#ty!gGZ~Y+YetZR6|+Q2RbDz89tLU_l+Cn z;P)7(jhT!#@$Q*TFnF^cut__5*b(F>>OUwRX-iYF%+YH&e1rcWm4!h+BPUVFYoDTQ zt^9R+A6~?_3z;GYmpNe{57O6nk*nE~lJEtpsBd3>pQFy(sMy|_MPRye%a!=m9~32N z_p@qOtiQy7rX2O_toEg05o8Bkg5 zDZN*;EqFWj^LRHz8H6Y61*5Sgx3`EdRc0NpoeG`6N}WLbt~DE%~vgJA_5<;4p_0Iue(1sjYGc1^ZzKO1)^bvMB$Gy zzj9$g>P3%7wk+Y?BUrL2x>!P=-iaK@1OEI3n%F~{VSX{ZkYiw{Utn%+x6n_OJ&?2;#UIxUBlxn{jj;MuiJM-TM?apR(As)0%~0BTUnjnHs0sf zT7-6I^M-VM~&eN3EUDH1e=q115KaxuYc57I?q= z8e|_M_M%3~z+Zb$KZUDf^&;5Zh_;856W!`@Rs-SA*($jm$HClB$&ICy3ukX@KH?4Z z@@#3nqm*hJ4ll5v~rt}J4p?}FNIsFNus$c{zt)*s^ z&ILtbugQ|+oFz52fZIc3IAJ9@@T4o>qt?Q<8OVvL2X+b=mooX(HL*Ckbh5iPTOkEJ z%8-N2(tMMvHwS^dnjnF?K}ODC(yBdZAt$;6-fnzMp}TYq8gXg|jW&JO1>BQHrg4^w zGLHOx1P)MUM*6zBsST)ux8-~KIS=7oojgF_=4g9a=Wv%*#{))&oVm}LMztiSn!Vq+T5;LaIclzJ#ZBl&C|?ZhEcqd+^6f{C0vrrld`` zm|cV?V#)f;FY*b3AU^umb-=4yGyzt{Yygw;4=qDP4EawQ`(OHS_VcN%;lFd(oO-MV zT!?>OY>T_K-I=pLzXnvH;_F3VWTH{cmk{R2&nXOeTpGBK1TvukokDj=Vu-yGApm|L zisdW&P;HjoDV=lyem)n<^)L2K{5c5ZL7PB*Dyihs+Yy6CLZrqd)X$;8vB1eJ&~F9D zX<_r;2!p}q*W+CFt&Q~OGQyiM9PGkhzM!2T=tfV{UKG2Mm$XxIzlniO^F%*(g3+NP zr7dbrw{W7)J6VbTO<6pr1VKa~L{*L>Vf)G<*kk7kL9(SA**ASG6D_lEkSJAACoh#{ z*iCcrz@T}n(UNH4W4k}~gmvk2a+5W^??o$gQL-`$L(&O)Hw=#fBF2L8@E>EYatqtzOjdY8t|{q+UQj9R zSZ)LEVsMMXd)&DL?aC}8f{NG^T0a+pUQF9Wn8JeeA{|cOa#TF+AKi4zE^|h&~sFy}~xvy%9DbnQb>Z)F zx@E!`FUVO42ylr<8Y9ahRy@J@YL4?nj@FeHGrXI>PGRf}+h0QaPzA;6nr2(E))Ewp zl$V*rc(3@iz}&APHe&GSUHj-Iu+LcK4Tp`#&o$$PLImHwOb?n_XxckmxGjOUoc4rN zyU%&*s#hQOa=koaESPK^FT#>cv4@maD#<&@vnzr&{~XBjr2@-vGHxBDokHJ@3A+R{ zmDDA4hHnjAbq;n0*~ESQO5_rZ<2)=Hif1s1;_|*u?QGu-;@({!{?ulC3tz@j6!NNP zr(VIB#g|N7L17yf2;KXHA=x@FJ)BBSKPj&%IO}>|qR#wtIhVTJYH+iwh%P|WmHe<- zwIu|cyJU@DS#(qtTAIhl1tVeWgM&LW#da4^@Faq;g)z`Tch#I zVoFG>c8sY^~2|h z9kMfYSv-C0+qjcdV$q-_dTz+Gf3?Q~bIlyOpHLrzY$ZI99CNpKi{|wP&_n>R8s1{m z*mYs6Ii&9B8zDBc<7l%L+XvI)KXjnC;9v)IW4?@jlE)Bf$%h+KXvv z_^9Qg#L!#5P`}nv*nke0VSK7k%ME*mj0Q=~W^B?ZKdUTvsU4>cEdwUdgnEBj$&&8W zY&&yz%Q;RGf=Ga2)hk{mzX zoHvI5en4J?HX=u8)JSR(AR5u$(v;4qomaNmU|9@PXVZ-7gugu$l0p}|VB~p%4ClN2 z9t{~Ol~}!M6h?ycM8YpC3-r~l^VwT@gAzJl(?e<~r7!a;kiW@IO(oFm!N|m&;eL?t zKz0#B8&(X~L_9z{!Eb*fxcV3`G)%i2aj0!5|=ooY)lQSz2)A@+iJ&{F=H)~XZuQ(b7GVd5GpNIS*e`PsfS5jXJ15TI-;w~g?+HKBQ zl_}{7>s7-NuVP~Wp&#N7@sCTZ2=QXoL>%yMAG?)fR{gr=6@a+~E-qE@8+1!oHYff# z9sG>pyL~yc`3BCHSNb=9(wI-@#u<5=%FIqQSx>5cThF&cSK2L7(P6Z9nF=)}o0^g~ z52Au1PrG~EU0!*qr1xR-kV}<%RJ@FH;SX-SUylg1pX_H$Jtl>#=?8<>RNXpYFoLk9*9i0VpBBAw9Zv2k`bT>e1`k@8`X?Ng<+uiw zQe2rM0ZAYOEG!Yk)fw1;Ru=<2Gd1H!lm}mIpi7hX+3wwpyBFCm#C$L;2XDJ)Q<8iY z|KRLU3WDDS;btQIq3nt&$7^LE`|;# znf*NNEFN9&00h^L->MJO?CXZoqo;dE}R*3=0xYY)Zyq;2~+yZcI2@}7DAZ4%wk}&!GP0^&`q>M=u&I5H<^+!57 z3t3r{;hD&=Y?xF4b_S27U-zsPyXr{K{(gr^vq%l)$GkAzHO=R3gb$^1?&y2k7Zt8u zQ7Su%^#`q2k$I~NJTdp%v0eMD#bw`?6weuHn;jjQyrNuP-k z(_X%NK%U8hY5Y-u{&*-gp%HYRRAk?%SQ#&B#+TMH(ewdL#jhGOunZZQp3DW8>Y;er zGSzwOKg-VSkfc$VhxRfj`k4sqZ7(-+atJA7S8o1yT*?zJ!StTc*=}VRl zD}{{{C9i1tWe?`K)x#Xs*j zCwS^JrGiG{H#qgAW+8 z{p`%zqsozSBC(+BCb9Y?J0`KI!2J@YlzST1+A+Ls(=WaHVmmSPWaA0(+p&?v-ZNoz zIO)2%?2&+p4fro?KI}ccol$L2z6UQJ=v<$Q3q$Hu37&yexi=3D4^NL{K+}oa>g)T+ zy8eI;^j|M-y)-Yk{tnMqhY-LYdteMi{6GG{sDR2yF2nj#9bN>)f1ow}M)-fCRHJq3 zeq(T?OGLxou$K$uO+&4Gzp2zHS z36rLxPT%UShaCPN|=kvmyhPjA@0jZK#mHNUpoK#(Ee}uZ>q6}9G&!00^i3WG!;U*&A2fSrm@BP$OwB}k}&5T%of6V~dV>&OjFZs&aFW1w_MVpyLLd;hl z4gQR*O?Yj9W8oP&Y6oO03ZeYXB7rEL)oFs{}>{uK9m&h z4C)D`68US+21v%c+o=J7jz7;Ilj?u3!oV^k0Km?|#hJs^+2+4Df{sE-g`>fL2+o#P zJ{-0lPLBUgxu$x`h9LaO1sMRq`nN0qP#DMurAefu`fKx;_mX5Oe>g3F9I{{kjk69l zP9*FZKTcP}X#^ delta 23487 zcmV($K;yr?s{)^^0uE410|W{H00;m8IA(lXkq#maIA(lXW1%{+9#;SWl#x9ze>E;J zEmKZGP*X@xR4!^^a+JGcjBsDG=H0e!+cxgDZQHhO+qP}nwtcs4chCQvXJ+!8nfFZc z?qntV!!K3YRkdneJEC3q*u)vnFJ7$AKZRO+7 za|fdB>I2FqfKF8OCcy;hAAr^}UK)}9N_>$`p*ev8y5tN=p)s9~&JtCyf1on;r!+$g zgT+;GvRkR^S8-V+?+!^v^a>KhTWX}16Sin~ZgB#)4M**rU=^?gjm1>5QRq`)*S^+1 zw%AfvH!%K69h=UxqT30l&LzD+OuatkbiR7zXiIra>~G}3G*n-+>9(zoDj**|#VtIYFx5tSoB#)?VSumCeMZzvy$Mf#-?7Y@gMW|KG`H`9G2m^3Sq!G^79T z38?=`n7CUwIsY5S`hRfn|AlijvA6p-nB)Hg{@=x9W8i9H`~QIH|8Lmc!;{X$+Qi1h z*4eJ6f2TnK;rqoBYp+ z{APvPO;eO)>^A=(^gL4Qa*`tD zRZywSsNo_hk^rG#lj5LzMXTw!?(Dcg{PrG&Bsb5LWKYjde`jT|-|A@hS)=4ma9KQ= zH0_sX}atAp1Zbf*__6y zLy(0y%R8Ecf9wSCJ4u0z`7kezb4%4Jr|r>jttF3IzyQd)>1z?pnsKuy+fhD;jpN_%5~2@S!f zlNHSgBp!YKfS)+5p7*)(=(p6L+G-gqcF5)zedbh^fbMa3tbtGkM~wo)Hlg#K5EgzIB#AWEaNMK{1&=rHJk&5VM^v?$DlH@hGrjq=lUiD@-+MQ zt=st>_Z=XL#fovw;!VdYp{NlUC|$W}^k5j%e=>58)3{zf)2{7msi=D)S>ZGFi%KDy zzCHYV&aJJII_kMhD+qOI+GFa_lj{8ITh5qxevLvj6-Yp;bs934AVqsQYD?clpsmoT zxcCP&@2?ptZO43-!@cQpmEM0X+zHJ2;a&m&fIfo%+%^Cf|5PiTy{#Fori(K6&XVjr ze*kD8s#_Tftu6%8cFrLktzu+y;XsMV=Ary{U{_a{QnkASJsec7k87} zNrsu(jcsvgCJ!AOC>sDkzlyTIC8626A8>F0&x^QvGyyq`l!*t$K9W3CKd-(dgP>$R zA62&#Fo1pd5B8rwmRy*M;pesGR8bv}f5Ic627s)=L;wI>{zS@>V^-&HX>(%4U8PC> zEunk-9AZd5#5=w}Ooe*)`KC(WoZQWN0J4UYY8s`b{l2(2t;CdxyD}#DXKdEUqPA6h zg@)_{%#uTks~zDVL^JM`LdHyXG%WXFckVy;?s-8E^V@gnRY&rLF^6G|N+93ze}zSc zh0lf523yQZO#-HdqqTb%H%E3utkX7Z9tj3B7?bQhczmk}Gx*$=eUk=(8^}uVu~jHM zQ8hX^!k3}_C32Io#FIT~PlUyU+2p*C3!42;rkWfd#ZS*E+t6w%%P>fvU;9)2WQH1} zG>Qqz)dpXro-D|n3yZs=oHQSfe=jcgMlA$$YfF28$`7p?1@oXwZ%zHn#wc7U^Q~X; zB!ejlk$$BIh>@Brv?xe?g)Z^ZCG= z^_<_F{U&zMP11Lh&m}7`YLv+9=~Hiw(IVBM;~cS{NORMaYeFRxdZMROdT^<|-l?Hz@l>?-_V2uyfyc z0O=Jn=$@zj;puK$WQ2F?_ez< z;o%yo5e;0y#vksfX{J-LAbDm#fZEkC|GZ;+DQo-L%7CxiPCFn*98MGXwLeoJ*+Y;C zoiuncf2^55pK^ z>}w&|%pm?HQ`RN#0w=OagN>m$PlVNgianae?Fh{)(6U?+U#^*yM>{{~$b-$745!aK z5T-mW_&kCd(9^g6pe+`dsma0VgC1vFpF`=i*@F{Cb zSrd+PdKq%=S^d(J$*RBk#||o!xYz<;!32=DI%rWbVq`fk!|n9KCqs!I$u*AWc3RRB z7SUJ$aw1`IJuYhbUEprwbfdoWG8M53TH;uD5f4_il>{n>5(5-;COVFZ48!3==2HzL}dY7Dw!cZ(PYPhs? zxZkAp^=&nq7wPj2ae({bvam+tTh*h_5 z4gyizH3nQo%9l6QN_rCe!pv$glr-2;%Y&9siC@H9YNdY@zQV?FL?I76M?MX;PPs&R z!vxG${It!a)F_Y=Ur4*2`j5TuEFPmo?n4cLia2o{_K4dK(MJu6b|bt`MUN<4f;Xg+ ze~cPi0t*upNKpYKy(68uyO-Huio_I~!9L?|=;v_j*yrFJIJQ;7# zH|T801hNwr!gknh^ZUapX@XdihS7fEe}3r9+u)8unX7OW()_}#Gb&f_enUwXMXOr6v5BmHTlXo4RD4hs7$v zNCarZAS0P-`Fp88-zqB~*G)}?A~*_DON6Zoxwt?Uv`SzJ%7`X8L=sUTutQsKF1?+P z5smOkr&aCL#(nGA6KP!|h^=L6f1<_Pn|UyaeziMm&ie5p;jcNl+>`7xu=s1wrJ0#l zL(2a6bwpb1HU)ATyJ4(!v0H^0)vhv#`dB2xV9jxf*|0%WTjzW!H?je}MVU&`b&N z$KAROje;oQ=?LqrJXFkpE6pzM)oJ|#=dMzeqi!oHFS+xALMG$Ptjq^38uOd)BO;N8 zH222BgKv#s{x3Yx=)?=c)w`yqeZHYl@FOECPnBQ17;!~%2N|Q+l zyA&1RHX2R0*5kzl@fU4sf9Oc1U#$`*as}2IQ+z8&i@GI4W#4-zdF;0$n+wE_l^*TW zOgY<}wyQXo>{%Ex8lghy)VkZHkexpEj(Dh`Jz#1D)o9Y^JdQK_(C-vbaP3hDP$E%Y zf`iW~ECX2QU_YID2?`>Zh%vOtbMeE6u)GI4>e-KREvipqlW>-`e;V{T3AOPhekz3K z0l%R%T~BQ5XmdlcbAUZm{0eGbd~5CPjp;LL3-+H4T=sWA50Q=HpvSR_bBz|WC^~60ZhD1r@ zq{^XQae1i->X?Go-3?dslD10+yAm|}>~kRK23G&=B*JNMnI$$qPWg8z#DnbZAiFNJ$Yf z5w)sDW`{T0fAwjY+$!q?r&MKRhU%n}>}2nhKLwITr&F>iiYuRl)IJ5d{HA;UsjVqPki2rtWc4EH}MSYG<|MX!Gj0{V6yf9tCSs%BUNcN_Iekv8>$2JC8jP#=}`;mBPfA+m+Y6m=T>Slqb9`j*Tx_b9g8w8sA z7|Yr0&K=_&Zaz7gLQy;j;s=ak;$I`rxL0mMQ90x!y7i8|JmGJV>h@U5I$5Mk#P{66 zjSPC5g4z&&|C;u^ZDV@;(ZYMD(F}k|sQ*I%-F*4@jn{#pPcwLvVbcpiZ4WT3DHL^V ze?h5&V6mk2Lg1)!Z=DkMz3Gm?zpp9^%Ief?mQPDrKmv&+Y> z>fUc1Qm1&mu%8w8=QkSFDr&9C(d;c7;^0N{|MB;-S& zhiN-k{v2a@qo}QW_baBNrr4%P*36?D3$L%yUm}~B)5nN^&bIWaK7L!|Q$N2-KTpAJ zo9Qf%TjsoN8(>Pq4o$e~^iJw}e~8&&&_t@#Mw{9I8N+_JB>F~xtFxJ5C=e^4Xg%-d zs@YTSTqKtDU4rhDNS6W_5O)?k@Pu7P^Lrk$D)rY|=L|k~OUJFA>%rGs6mFaA423XZ z^uKjFYFyJO9CuSTY}*vzgDJoo^~{imLOXyRoYHE5@M~jm4UZpk`cyiTMVI8R*e)#V#gNx!Jrh?kfbj6}vPq_|#{J1YJb&M92PMb8 zVuX~R?&=jo*T~S2wEq6Ye}$QDl93&HZ-XqX_`>HRso6h&iK!S==1hHOV1}Vj=DSz^ z1WK|_;C_`6b<;E>Wt*Rl?UmemR#t-rC*aAZe868P5O1OUkek3(Et(KLT=90HpPKQ$ zg&gMD&C%#OW|gXW6jx|4w)9kyMGA#|qX13%fCV=s`?zJQBnGVbf27B4fRD@zjtV)5 zmsMrx`qn&jaK1DC;#~S=Tq0Z^9Swa3-am)^*wv%^zkj+RbI` z{JZ5&O?^awE;)Ol6epcz8aE{O%=nI|6mJUMh*zTrYETi__kqfz&^r3Zau4909H8Uf zsd&NfJDF}@oFWeke~}5u$PNU=o{(J*zKq!>4Ij0E3OF~<68!CYG$XvB=yuuM@H(~E zXU%MdKscgK7!=>}c!Oo`>X+Ao6IU+h@$u2g&8@B(SL&Z1>1F*(8E>1vF05tzNd~J= z5tztvkynQmeSLm<^0J3%#-XlhZ0jZ8u_B_PrQ|Qo-vb#_f7Lo8v$J%lGYpJ?N1X*n z3lqz)+Nx&EzU-lzSFRQNs816k!cMepg+#7{x5G0BKrrCRnXM&@d^ZzX_bX#F(pHZz zLM1D!az(ywG9}F%bu5oecHU`a3SS$?ul6!|c0R9mTY!#+b#Iv=dcOKBA-}eIy!z>j zB`IsJ-o!(veccd}-GGdkPwxj)XM$*pFdaPkjt!B|aYA znQ3ZJfS)wc`c)84VZABJ> z4dXap&AX6KV%7_tJGq!3dnp}n2X7lQ%ZZGu-wg5}NYeVlik!=tjF2NtdYRcpJDJ@{ zj3OV{JIuiDjdH}AjPu@;*YGF5s{&0>S4m0N+0q!0$) zpL0+S8!Uxz^fVyzr}2dUpdcXF;f+^p=g}hLf0g=14_YYy7KV-Oj)bK0ITpiPG*9^C zA;2I;m?bVJa-F;T9^%&WXoxhwqLi1anDvW=pProT^6l8B;7O;GqG|dnalSE&S(&nA z+yj-UA@*AhZ()Ie`x(Bi9dr|2cr@SnoOYT8k*gl={=5zgX2r?V{FO+5v6cTp%P9GC ze?b46o}11%SCQpd^UV!k_fsPM7CN!yE#Q=B_9f9TO*n+8DG`k--|q+zJth+>B4rEB z+&BT`H-I-m22?AWuU8bL!;-Qhje z1gfi@4ICy`%E>M^`hlzQeecKNyHFZJfBeFNkCc9&*7hv*kfz3Xci~iCOD_4L0NV`| zMVN;M1@X&OnprC}q*Y~PHwS6PSd%)Sw0Jfq(g^LBRttoUfE2p-tsk0Yq_ zY>->kW0_TVp%H%X3XIy+JePsh^f1`6` z$$+DrT9t{$WrxtzB#p?4L#q*xQnoQ%KJwV2&~r5Esa8+JdRW#uEZ<-&k&eqq1~w`< zWpT9q+%oJO4)4#z`6#>syq zwLR-M21zag1g$}~U9;PKIo4Aoe@`p8s1QKaHRb5jJQEI$9a$gQ7!-~{u%`eF!6u;# zDvyQtOPE+l36s-Oe3Wd2FRNOlRCcT(cy@7?jk_Y zU9f&b%!>V78G3m~ROSD0>Uo|+Nsv@G0VJbUskTN3MNTRdU|E+MpzjpFe?9Zf1=l!M zUH^R3?(XT*jIc&$7DG}}qAFhI`^le}vp~q7P^5-hvor1qprojS`^%p_<;O123w$R_ z)`$X)^V3qz%Vi})Dt2#)%X36A;G-M1sElaUYdO|7uKWIgH1dH`^NUum$dYEpPe(yX z9~WUfL))VM+lAP4PoGQ=fA|&~NqgZe3Kui?=QLhax?V0@il3UD zw0k)+n7Qr0;077dVP@MKQ1taX~fD+TwtSy+LBQ+~ue>xt)aYTv3ylJ1C2V z6^@e>0cKptE9d+of4UlAOu4gCf7@!qMLjI51g8WAKv-KY5{L@sm_7@c-_Rw=emG-e zK9a}lLCn%|)qa|*00;%hmjyg5Ln~1$jCvq2i5E(YH2`vacDfP!yIP3YrnSN9f;pVY zG+ALje!y(}Tk6>sNguC)%nSvA=x0Z$c@K7|h@oIu8fi3ie+qp<@)7s}jMLo}y{k7% zZ~t`U__@n`|6h-lY4%s|;MV!gl^Ooels9y72q99z|$e%Ayp<41m3VG z@fs#JcT&h7<1wiCrv>uW(0qJ=WS$JS`FF*xyIjB!c=6-TD8Q9%m^HWb!KmWt)Yb|J zpe@xsL}k#pe{$Ty+gNz@*6JMYcKRH>q2?At^3P|l)j zT{Ql(53%C3_tg$oKl<2-##X4yfDwVlXlX(nuK+`bu;?pNa810B&RXO`Bxn=JHEuD}#c~k{U@=~fqm*B@rt9H8$qZ3j!3kHt z%*vskf5ek{>cD~6hH66SOa=Xaoq>|3Ud(sH-MNR4$t)-Vt+GxT^H>K#v}bcGu-`ZE zk2@UrzjI2pAX|4l)&}H(A^*HXi%qE9B)Wse8)}Af_U{>7G9INU+JL&*uMeV2n7BKs z5#%tAF2(l~-`D|&Bu*-}AS{&QNCL{q<+`m)f6-#-y2X{Q-Kg1i-#Z6r)`>##Va-jK z6@q5d{n)|J&Iyymttu*(Q>YnSTo?dnHsG4SIKb=A~T-B%sh6f1`+-hj3hadyjO8kl?aR;&7_W>Ubv#>94Y_FsG zf2Mbx(IfRWcfL-$GxlWqM~-)0DL6kB^N(&}PPdDo_a*JUMP7em2&Ed(7rPCw^4f-f z$B{3GGRPfgu7BuK<8N?p*#$ybE>gAYdCjcYT?C-$6`(7&}0xwFzyJym|cKs}vJ(BhJ9kg!V8w-r|V z%S(p)-zumDec=4=i_8w;E-Pm}PD6*&8adwXkEv)~!1_(E<&Dg)r|7hJS&byjzBn!X zI%&LOwzZkc*fmgh!x~dPKe|7SK^;;MpSBT~`Kdt*58f2sW|ZpJaE@b5>*8R9e}=N+ z?v;VZYOs*i?MCTPb-HAQQor`2VjnuGmLW7fCl{DsnN*z<52z@xYrhGt9ru?>L91s$ zUZ_fbim$Rlv469{j_5tP`n@lPDD^ryGZSXA4GbRz6+2@q^14DHYaUWD^~b zierdBTgBZvmb&)SguPWoF5p}O6Iood^wp3&3SXFkbbnmvI^ZK!sU+||f8k8`w$4;; zFR_1e;KFC|Qm^39en&nup7k%}+2Tu$gtKSBQgd^9df3B{v7~bC|GW}z9h|q%p38jP z*V1bpj%)Z@dSUM<4PTb&Q?Kg3et;H=o#I%%mp)e4(%aIPOex?M_ml1~8~`;J;Pa3U zX}G8;{BrsS9_7p$>{|L7e>5cP@RoRj+VdhWY5XIXb=KLwDL#~H2W zxG7JCapA{_Fj-b?ea&cw`;c0BAy)=o;6Tw+nVA^|v>9~iglR=M!dvt;F++tsrx3&9 zJO)g6DOPC|>jD|(4Q=Z(vc5X&XT&ALcOR>9O=C{8?uEb?5X3VPf3yg9*z`G2gz|T1 zKIBCi8rNkk6^17fAtXc8-J}wg1u@5=d>zbpQVq~nRcy;kN;#Ph3gT_ZEuS@HRaZa z3S`dfw;>Uln7Csg7xnbPvhIzJIKqbpfwZfZWv-q<5SG{&~Gc;{-?_c<}i3S#01ok8?`@+F|TRFO_(m+|p z+qxq|jy2j7uzXxR_zK}p*N^9=BHiPTd@n6Wp)~Vr4&kGrCU1;YmdTr7pntE$5WjVG zXUBsH0>)ogf0Y3XcIItk0HHl7%tD+iEm_NAhj(r*>kP&sPF)kl)zhWM7-}K0C zdE{(_A-Sw8dzpPzaYzA{Xr>dwXuFAt|0WGxrcvZxe|ScayUSPxx3O|0tY>!Y@j<8T z57{)$h39^ze5HYd3I@wu*xEDM=qb+bAVepLIEx=AEIA6SNVg!gGQJD0;;aq)f|k9#KqK{^Wa7S2055Cz=!jW@4xfr};bo5C5JL4(y0-O%a4yZ^#X%4-NO9I)FzPzpYj#}1e|^SWDIzkZeC}_iyV;rTOvBJ~*DM40 zJyTab9KuaxG1)p95Df^ky$N~vXC3IXAwo*H+^ZiK$9*pBS$jui>ej^K7c++Ff3+)P zY|>3q&+?u&+qpKctgJ4yeYdXh;>Kpd^{!zQEeedygDD5bh7krXhH*m*03~$@kT79J zqFI<|a0Ix*X>Kf)m~otGk{X%NG^D{|r<{!8(6}n-;iG6zjA=jdD2RzsR7J{-m4{B5 z3a62RMRYZ6BpC-AMP;iD+3ZI2e=9iwr;3{Z#T)x3eg#JxVcBzjD37qsus8Q5+bf}g zbJXUo=z4;Yv=1OR-nAo~h8Ur>9!t4ScNI6<1N-k7sPi-%YJj5XPk0fv72Zvn(u4o42V8! z+_A970LU^XgOR0ER!d{Je{FP7f6jn=vV8kapZgxX23(KYG;`T4Vd-zuj`Z6y@3J^3 zdfEG^b{I$z*~dOS^-T~;2Gt$;>DmUCKYcfRPTdwMv1D{X;}Z5y-|M&1v0863Y%wm{ zy~CtGi#Yl5CocXP%B563`}*!5<}(xFgHC;t^6Ylfqa|}%h^J6Ie@OC<>h7<0;kiC4 z-H;I`E$@5-{?{_i+x12_{ij4#VE_P#{_m+e5qAR{dutOJJ7X7X6FMVn11F~$Rd^*V zF_d2$0{?I<#s--rETcp)7Iz7oB;{&a&}tTP0yFu{(%ArN&Qp%For5#>voQE}%iFzQkof*r;C6sG{9OdP!7=+DTUFBD zGL2T_2T>i#+lrRZS+xr-nH**qYxbDPnibfngHh&pb&uOHGWOS!k{8!VyRje${r)(8 zh#&~Y?Q133WZErdYS+>F4vX>+#0Wb9W)`o61A)INP#$7Ce<~%VHRp?wo8e+nfH2I{ zef8I&tn?Bs-xwKHp{5mshOLTqE%k<4CKL4}Eei--KqRV8P4UhwTE8%dSeWN*gBJzvlB#4Gk7Kwh*V)!?yykih9Pc@ zprbeb=-*a)CiNLm*aNYk$a;x})LpZ?Z<7k_uz9SIFiF~{X*^wf_#C-wXMdSOD7B9u z+;F3-?Ax7s)Hmf`1t;?IW#aSk^A&Rc_1%euq2VWje^Dv}hTDfL6-poA4Lu+=apI(% z>X>=f7LaA!_C=2a8MKB-`~!g)m`KqgKRgId`F3wc=K}aQ=DAw zrs|@oMmtp_{BbS^rB#)oJ!B;CjwwWRn3^qny)=&z+8B}2oG3@KlqCm^Sy}f}NLWHr z(yt2Je?@^LH#Ud9D3t-*xfRl!ElY8}Y)aOpA&s6aO(%ts(Ca(AFSFV?yJmRapVq(R0?KXO1!g`CiN>oePRBHev>OWvdx_Z);sS#rEUab}_i6 z8DB(z{5>cgCRy7(MD6OG!1ts!zhICn{6npcf7qBn)ixs1ie(wXz0rXa(RqA|M5)NN zQfhlD(_3?`aL+BJI9lJa=PobbF6_#uw5*s?!RlKt3ASVsIN|N4iqZ>(=CKY=+PjAN1Tys!va6QNzj|$ zLNB4XUx3NL-~+(s1o10{#PhTb95^eQ3gh?|X?jE}LXrTKt$`&4^1?bJ#L}voYLV(d z(O0m6JpM!-ZpZ?KE9ZVjZl)#wmQ6Yme_$uzzIg{jO;<|XQ;J<%s)4?=pu2QhTgr*P z)S$c67)iAU5Y$0&^JB*j|ihc2$Kl$kXx+P-0#12ssEV$6~I7^$NT3L z4Mqn5ApLKA7lFZX}wH5j5rA6Fc2r?1XzzLWd4z)T^ptr z9&im^0vRhgpwY7?CC_o>B9+Aqe`$4Yb5_XDqSMT`p;%^Y(LiTb9TT%fJrVG$$z)F3<>8;v`A zvDzRWmMSsaW~}7EZBPm_sfAn-yhCO$(Owq*+L-gOU{PxAGaZZOHy3p-e-~ZM!fkcF z5XuYqrcgkTUx-xMA9*g5n#)GKW2DJsbM~Ht31}kR_SsxaXK&hG@Mo+(Bl;>CzYtK_ zpdru_RSE%xV<<@MPf0o+b1fz}%M_Zrqy~5kvF7l+B5{K6mSnLgg*l}q3XPHj*(_2y zUyeXOf2D~i_lyA)4J`Zce;0>VzN0cbOw)V01?G_AUrWz3q@g_n2 z0I}?jk%iQpakyFYx&>w;S+&Z1wIMDMkU$uz6?yddOEXNMDMWHQe>ljXZtN3ElbA_- zUWp+v8xm7zyNV~pJkpCHA8)w?uZ318-Z|6JMsaSVk#x8@Dcvv`=$xtpVlFeWjp?D# z^s{pIfdW#-jqxVm35aE$Gh<~T>Kv(Qr<5MrOS6t;r}~JgD)c0BYp%6fXYgP{sG+t_ z4&#F`sxwq|c1#c`e^a5B>^cd{4%J12$bP+8b)=g+N-Fr$)d{L2<@yEat_e4bSF;yQ zEjPh9$!_VP;uC_X*tjd0-^|rOo`#U`Q^k5LuI-G>N^kPMfw4mzgg*KQ>Xqs}k4DHy ziF|WNiKNW+YIqWTjwzc7_{PmkWjhS;6}H56{45>n+Eou^f7Wr<+r)vfmRN>bPR)i_zS!A>Os7`=Q0z8XS*`xah?&?Dszm65+cgvMGFDGilSR9DdfCX=(A6}wo%#x>yKp2LwWJm-{&;`ULo3q;L zN4=SxYq*gFe{tf%DA6?=D6EMMFS1QID4~AExPR7Ev-74tWo^1bB)H>!4wSQU>MbIw z7^CP>5?0MRMy^wknaSt9;6|)_YMc5`P;G@oDMsW?=v$!|KDTdbvO z@3VNdZuKFld&M7uS$NIuRa&ww&X7iEHw2W9a}z3Ef4U;nd8HvvchdJ1DqYfv6p~XR zit{>!d(G}x=h7c%^EH&5gxqW8flE*<9-uZVQ;d&rQx1Ai+yk&~g^{ek_gMM8x}^nd zg;R~~3S_fd-KRmEb2&hhHwsfcm9UsM-tz%jD%(U-ec6?Ui(7ErGL;@(e|EMlTPKEn z%lb=Sf0V`D#3JPRxCLLzO~Yt%aEVhOTevFrPO>*^5MNDl0^OKpn^+ci#ulI6c-`v) zUn|`C`3UT9s(UJ`^w{RInKqfn-V^p3rwnGvLzYLoe+l@C_gzul_Gd9Kpu$RYoj9x* zJkoF|Y@=V@mz%(k{n%~ndwH{)(gmfzF}Kj1e}Tq--VsspM;rnwX}>?)TwkB8_xjvE zYjf#b_d~?*j*NiNX;~m^wNnZ!)X<9uc!AJ)kbl20(C;KHe5IKJwuBsMn@)lwliol+ z<1$)vYJk$ba`^DBUo!}41-kV{C?N|a5k9xTwF$o6)c}NIY`1xemH=XuM?DACZInT8;G&K*$hK#WjKkyaq%a`?Jzpr&*b}^ZY zI{NB*+Om+%8kTsPA5NQ@I~cm4ea3C7osUm;y>Ik;+sP9aKXHy+r%H*Arw07uOiBNG z#hx{ZAy-d#;@uWzb_NI^C-dpZ^L>YBe}};bo6-7LwDQppRVU;e?u(3Ek|3-1vEG3C56oi$1(rzo1RQoQH8GoFX;JVVt*PXqmE%zsQL9VDi)x&uLHe^gbo z+8*EO0{%8#jl9%CLJG-TN^;6!i8`_iv)FX3mw0Vdo;ird_akeW%dWgmjaR3vbeK70 z`clzF|1CX~@W}kMSz>L&`qdxHeil?bOB(aZg8A(6pvcPg3QTWUu<#qX3UZ2bw=|8Ry6gyaYus}(r)k^xUCvYRqt)9x*9qa&4ouv+P$7~WbKU@cTaRrf7+Xpk7hPu z5OCRae+={iwJ3Ldrbn5-mhe+9L{D53{Q%NC*@hwc4o(pxV?|DIIWRViGkU6 zaH$=l&E^ff2a=6?>xn|7wpX~1RNEJGdneIwh*o*`xP=^ZBtP0vUT2(C=YeCkEwEYg zm7?4B{mXLzN`N5AV@f0TLRg5oypRU6gk-CLIQt+hP zoU#vCO(G|yVPvBb%P4niPHFdm+D#eLa@_J%cKIfu%`{JulO-G-f4A#!#S_5W5Au>z z=$jX0&=VwpKU$xJp1ISWwD#GxL4`LAAk-Asu5+WmC7OIo5_|MU=ir54c1Y+Q*E}X4 z5Z0kclBhJ!A8>mF4)-9pANGd${lmCMMOhm?MtMYDyi9P1vP!K^Rar?jr=_@4mOs%4 z#qTnGbRB}tu1`EffA#psHW6^w1u4k+3QwC4u*U70BXliSc;%11GZ6R)N21pnTTZ`$ zybPPWHI5peKYGkjXOD4rZlBuS>%~zI9EWyq0Oj+EQfvk8+24@K5EIxPAUH!rI0HzS zQdOj^ctL2pEgO_wNNAmIS}Aj^4l~5Q9~l0!9-Z#iU!Xo`f59FrsCXSXdqXI&vW_O`uuZ@qfDw?EH{zI0CfevO_McS=cb(!c)nZ|`55 z2H$}+RtM>Q0T2z->Dt&9>z>L-L^MJuRSS_|wZ!Yu(3k;qKi7ZQlU$i$e|wI8@bAR< zg0#Pr7Jr2CrS8$m4)#J4i}w7f4#Yyr5mF2hEq|f^f2+W(6|^r^hXerVzySat{%-}Q z^1tq4{V#d>?uT-W`70ZnBg2HG0nr$Ugg^>tU?bHcLm@e6KmsT!$RSvgv@>BkelyL* zjg7P*SXGF&WvNvmre(9DX;Y=bf>1rby4osv``KHE{{jA#wt3stl)>8+7Ln)OICsT8 z_vxGWf9bL7bM0p~3$*UQ1|s=*pmo`R;ERb) ztsXprgjTA86(uSd6u^7vv^Glzsk`MYo5avp!ip~h;aw3(YMv@zge_DWj0!3|p}xWA ze;(gjX8)`nI%Q0wX3tq0Z||WQ9*+q-e1^=YwA(+Lysy)o6#P+dYPU+Psn|V|Y{7M4 zae&szWIpOls~nf2PI@E>TGb#r7}9~HxRh_PUTHf_N;A2f@1)-1*^-5niMYI}_3Gh( z+S4_(C>laZOG^gYdlrwK*?K*imG(y-Hy$BX#*FEUw@O5A@QZCOE3_B7D^XOJHTU zW^2eha;wrH={ZtxAfb<>&@dw^vVYtz=IX3|8ZjZyX*%81SQ6VZ zW7qw7AkAc$?@Ecm|2q~P$HFz8f9$c0a|&9C!ve1JP828p-WQY#EW>al9rK8%R}A{x za?f4*a-~{5tQ71s0|AIEq(SbkOwQ#4la>DN$CmsIvj%Qs_F?et$~h(tR?7_7-bpf6?uD6VbBB zSys@ds=pS=JF}B9!8KxvpIy=FgEy?ms`6E0I7NluxQ0dMm}lnK=mCti`=&Ui`VelG zO3z}05vf292631Hy^KXY!t;)_2x?%sjDg)rc@O7}F(;P#`6i0M6 zZM_ClJjHOL<+q65;sZAAe>s~K1@d-8Xid%T+RzPSCYqZ&1CJ&+Q(QJn>he*L)(e|A ziuUY$()u%v($r-$ojKB@yhuQ#CsE7(`*?bBM{ni!vty3IPMnFbUwmwLIt}u&z^{kM zD4QB{7WA)2!O?P*?f~$T?bYi53q@F#j^X7-Tr#jIR!yFI!ZBk?f1qXSG{i>+u8~M! z>5YgDRvi#l!`8nFY9; zq}IH14f?U#c+5zWy|NQKMzN+FYa1zDnUUQwG$|W5_S?yQeEiJHOV3`qp=wK27c}dY z<2<=6QG!YxA~_;u(UbH7L}p3@jbn`Le<%A2r8(0t4E0mxe_7`T8lqw+)2lb&JZ(}Q zldz;#K{59d_VZNTFzeb?T`jF^Q=HV$(G71FtXC2&6ar+<+j^ao%j9^z&^~M2^XFWS zxM>sUahK0WI&8(u)=td8oNJFA)p{-i6P8W7b}?~=k7KttP(5QHP5t$KO`pVMQ_d-tVid3#SgAPEN@gtM$#Bx{ z{+M1$F>*1iRf$p*j&KHL5l5(dEqvOnikeMM7~xYei2TK0s1POU>7-2*IcI|T5NbA} zr8}aBsUUI#)pWUNB{;h6)=Vo&jrNmlZ|0!3${va?f4M7+^n*WG(!WLQi@Brg^q*_F zyL)W4;)mU^dMB2xefS*nrEu(_0AQ%R9CnI#}Obo^(TQN&!NTS;Y*b8UI0@Yr+fYfG* zkg9wnC`upda>Qy}2(fl1#MT)f1&TMjO9ZC;e-0}tinW_XwxI;{p(dOEAjk{`30Te~ z4p#TTR@+VZy6Ex*y0xs5aL69unzvqSS*bmo9F@?fXY}3bm^e*LhLB|J#`&XtJv*njPgOgVfyW~E7-Bc^h!j9+7@2) zcM^$oU;37XK7L}z5&`_Mbz*-XTj_~dX{G&A<8o34`{Ff>-*$`}T_?h=ZDrv)9Mh5M z6l1UDXG`4t<6Wy4C9^Zp-5l$gT8dj~nM&?m*B${1~k4yw}gMQanviGMG^iF%4 zY76FV?P2kxdC3$6X5FxglMBn%cGeM?3fA<-vadvRXi zejmgVhxgQ*J}t(P6$3;zJy0?DWL$eF(|!}l4q6iHu>oa~jtgAuXHdNM!CKTIx%krT zY0vMJ&`G!zy+z(qa%*&w?aN8<6ayaRc~!}7m=oP9EGZ=~?Py6Z<>=9f7%Jgti5j@R z2xFJXq0w~=U8iYM`pE&yTpu0s)6`rZ+L|3M^LA7xexbN~i8GG)&Wqy(yriT#gHYN4&PkxR}MWK6X=fzkSbG=a0^OANKYjKQMz8 z((I8YP$0*p#AVCVCrvDx_hI)Cj7vDBvDhx%>#UbG5<*+Q`c}w1&2h&Ji3Saqc@9R% z8yIC&TLISw^^$tUkqfQDMT>XS>oGY|)gF;b+wT3|b(pR&J-4O zn(OEvvt)vUVEyX!Zy|h@oOt4EzkCiZJp@}j4*-GJ^j~BkcZTu-wO_0vQ5a@Bc}+8K zR6cHvfLG4*PHHT!wl-@l%Afn#f@wZcv9011L;0k(c;|W=q=yp<$4cDM5x$dgyq*J% zmby(Is0-yPsXd=RWh}HXM=^Xwforoim6f_Ea}rE7v8>A+AnK`LvCD1DW~HkgN1HIB zyasH?&lHSeuJxLzT3DL|$TvP9R4mofw?>}d35on7ziih!u*qGzN}o1QCchM0r{0h> zD{8x~c8>^g!tqQo zL(Ha%XmOxvCe!*2GEee?<@I|t=dJ5R>MuaEZ}6LNvG_#6)#8s$U`2Jks9iEg#B@#w zv)D>w*n9F88NHAQ-Q_J_it8#x+6pYKGb3N`%*OS{808Evk`CW#v zu(v7p#WcER6DPt$7%WlSl5}wQ(H$kt2)=3ibY8Xs;Ban;9Bvkl;bkSn6ncA^tpdEk zS^IFzefni3oAg8GCE`*rl*GQNpp zRn$vwB%{FG#v9Hg%~RInOs=rN=!!8`!93t?l`e+KI+iN0mz;V|56>sGu4^uQkFJZx z(?hS<{aOmf9?op_s@kT=eRc6_LkG~WkV64gJ$(po*(J|;GJdl z)4dA_hCXuD5Gg9;>77_Vw7(p3v>b`kb6b{Ab1D1A3cIrIBuZkBREi&VezWYqphAX6 z-X_KC0`axIPcWQh8KBV+ryQ&Y(Pvc_mY3K#W}^p@NCbT)2M5w!hELIq&%d6;{Y@v!Ke@lp65 zK}elnV&#yCL}rR>&#EUF5>a{5?1rj!sC?cvGvTE3CR91wER)9DMT@!09BT|lv-kov z0jgS!uz-BUFP7)?so-} zW?%gv+BnreBjJjuxNH(|!ADQGS8rPFHPaph?blZ0J@=KiBA{g1_)AfhSd_#2_SxeJ zEsOYq6$yMVdTc1G=Q)dq1RWWfqqF^XUgWQ3)s$cSxueARvfwbYQUZvf=^6FynC|^Z zCuovdwqvFxd<=*GbB1M^k(M7<%r?ZH&xB5w&7F^Sp0z0BoVYoQi+w9+o_T^Y(KCXp zPMn6mTpsBAGRpm4<9PBc6+0>ro zIPQ52k4r7t>g2EG3;@IAeZ}yiPm`N_^h78>BiUo$$U*s7vbE#8IBo{C5h=>O+b|3T zk-O4hpZnLoCEQP>ajD+cyKnzd^zOt`&Q*MOPjowswr^PXW-~~irOkdf!${_5o2r~i zn3i?@yeDBk^~J)dcgW$V9g^55A%2aS10^+Db*WSz%iS|lX;UDuJ&4Kofax3a%j_b> z;qC8k@*Hd9Lyc-m_>GAHNh}Jv!cBh=i#6u-4LxiPS3UecT&S8qZY0lY8HAjY&WUwP z&7&n=n%1yOYRn4p7pLsEG(?E25e)Lk9llyQj|{r{83%dG%U5{V)VipW9nwc}ZlmSp z?dFmATK$Kr)3qAl$9DDcb0_@}{w?z_=B4aEZGz2op9p?#liR+>OuP@RTDNi5{APTW z&@QbX9i;_8335a(d(9h$+T831z%dB;0kXNOQvi1Vrf7U?-%X8}rWAFnKyCXaZ54{> zfOfjM2hjgvTeE(hbtp0~Fq|_)5?O~s9CKGjMjWl)e`O1}`sAxcIhAy0(kONFfF{1J z{^|Qy*}vXx+G+VZ`N3!i=7}!`UMUMlnV!% z2ioj1hoA0iW-_YvcVG`QLEPP0YQL-A;Q9z9MMyO7D702}{2n8LsbBWH*|E(8ctPE{ zII+k>B8dUA&Tl8!JAn!Gk8Z;_&Xh{2Hg5xw-r`o7>?hMBFA;M2b^H8O(!n}se9ym0 z*cU5Xd3{d#t6e0ygp+`d&hcTCQ|9~DB&FTYcndSEOAP)kj3$q&2KP~;ROORoW!o_( z3nA2(pQhjy>KOHsnpl5pkMQrLY-+5yje zEJQucAO3PTw75#J+7QKwBcT?1xY9iGxw}T3l9+A~kW{G=wMT>xCDdgdU3dIUF%#PF zmpKy+urTMz8|rQH#!d^|rM%vMOUdM~2~HP`bY;xO`>fK{1@AWST^+2^TOim?+L;2+ zz0g-kT{svV#Y=^Pb<&Gml7)fCG)liAQTJs&vYDH#WSceQ48xS8n1{8#J)xyle=u?Z z_R#}vluuFj@=R|;1P*_6;r`DdB|@s!9G%HKVCaL8N;8;BgwR|0oKr3PE^oPj;o3Gu zGxk^h9>yTpEcg^lWk|)HK{MU7Hs1{08D^%`6I|^W*hk=hn-OO(YqHZnXP$#O7fmR3 zKWHNzzH+y+BnM-i`Xly3+`SA!ohLRc*Te=%j_F)MwW_tj6y|kfkbiZxA zplPo{NAfvwzKQSEL?S)vc0?#7G#PF8DicEA8(GGa($2h!R&SW+Z4NzAWs;Nes_68} zVecp0eXmVGpprHc$~akU3Gbd6W$<+vIGMtm$`*Kmzr?^jI_tHgxF-Z|=+dZJ{9H0h zDo{{ZpZHcw#Vad!y^)D=a{6Q4c0Qg$;_K7A1uE8EWS?n*Hat0ro~BklHk+cEDz&wI z#ad(DKZ^+&V>wenrz9RpL^bNBp3ED*KEv>22E?2bSkw=gk2nO@aGOJJ>W$3Q0QF~` zYi5IWU!Q90p3T(a^*ZHvnUhIEJ$J*+WKft%bfo49+ep0{eB;&Q<+;rhLOyf5WdT|s zQ3LGPI@h#(bvEL|(uG(Rf(2dO-Hq-q;kJ;pUCz-m(szm;Tj&?1CytsnufR(ZKc;*f z^(#tH84qRHUuEE_&sBOxjVhq+0WdWIMK~Mlo6laEU9CsZIDxjtI|B^Dz(Dwdl-8oa zAmQ7AI6QRZNKU}@eZT)w!OM1et(v0lh?EtPuau%jN~JBbT=)Vs_sdOBVMO2_@60#j z@oT2`TG*Ti%M1N(^{LfQZtJhsu+j9wtX6JZz2r~bD_pGbU8FMC4SjV;fNA?l=e$n! zIiwv|$9Z}}-D}3i-mUwc%khK5?7kapL=Qh1qB5|#78VtF(r>^9f&e=G-B4&i1Rx$#z#JaYzmva zt~xqW#(b)@mChNy6(A>&gS^MVa%^70mY0)h0W`^sHRZ-Hag4 z(<2cv51Qb9E|(}`_rVwC5Xo~gQ}GHI-|B9qAcxOw<>be{4vKI{>7t}0BFuARRgK-C zc5jzb`iljh_v=@yBWugAXCv=cwa*F$I5Erl;_TRdebJ_D9Qk09&EMHK%yOr39F%gDU5+vx=(jfUkcjFEx+o~Rsud=amcm?;d0D3G zxv^YpP?MMVl4_d~5cQTHINuzXK!BD|1PJueX`;{_n>J}t;*q^6D%-hg!!UZ4ubSP# zJ2y!is>p2yU-glk+50Y=VEiR2qif;a)-oG`_t|UtT!q~>dp^$*j(F+#STg_SrPkM1 znzf5~&Lx?Scr1&|R?M`feU_w5>&lnGDk@x`eM-gGL7%qu$G*=Xl{@7ecU-~Ng5anlkj5oL zQAIwh4RWE>N~MTiuZ@DAJ?t{w2!m_sG7wqVt~b7yqv zdG|EdFT}&C2vkFCP7L17B;5A6bCU@zl|@1XgBbE<)_+7Sgd(#A2M7foMRxnj zwlsg7C}92Ny(=&}mqPlQH-67^nTMKX`5hv#woPQ^U}8zN0v~%35f-(HWX~nJk+~B0 ziO~2H!t;sUyn4UJPgB1qnf~!AhV4of z_l+pr4R8R}4j^G{7WXcp-N*ZyW_Ms8hF+>`B96Qe?H51X;M?c099@}8ym344`Kojw zCW_xwYf5UAd12Gt#2y&^brpL>qDX3kjZVf#hS2Fmv16q-XnyWqvGT1c!_B^)8V03$ z*Rp5FtcQ(Qv#ZeL!=t8su@bdO6s~Vv^;Bmu2UIrqqeVF;G>sB__`zg&5fMLd;fm1d z&bb)eWmHCfHdod==Lj#&!+J6#-a{bHec95RheaRc8NqFr zt*i;c+Yx*0b-fbW#8c$gnn}2xGgOi+1z(+{jOO~}^$SGLbKpwPqy+AYuzxR+7nGIH z0ByqQVoDY(xE3EIl7eJ6E$ohuLYARUMrw+_GR2q?{iU+LNjOZ=g28OD*RyA{NzCQz z19>8e2S2z?dEA$WNQOk?DhgySb#kh#D9LjZIJ=U~LWq;>4aBu0vgP9`u=jalxQ+H5 zm8j?N8oA_`POM6}uHYmUdZ9KnvwLtN02N4*Ee$8I+q-JvtzOf*kb&Tw>|cs<)&tuaI$j0kfuP|M=pD6lcVU@;xJxPC|n%pK)_K9Y-3^; z>rovH<-Ae5^QBbBtmR71}tyiT!Gjs_4*6=YH_k1Eqlq!-(ewwXGsf^Y!V(6Yiy5*vykz~`llpDsc543P`0DuRR$id-Y zjiH&G?U0K8LO;9yx_6r1b6`-n7GEXZ+F`MN^!+k?qS4+8`m2Tu#Cv9wVU%e(OxvEH1PH~KW8<8tCcc@!( zxe-lNu*lbJ=)PaHs1arp3zUd#V9AoivYpS*z>2*r-X8`XZTuN5jdReyx9KV7i4KUX zriO7n#kf0}v3s=x)Bk=g;BhS$OwRK`p z3kUdU=gR5;{h|K7+d;uHgap1f%zD5;U+Fh{>gvUWf=cDZX3PStuz6eW1Vy#(r$FRE zB$!f0{^coHKKa_6aWDD8r#fMmxSXlsTK3YW$^>uPRtqjV|FpHAAUG-O^0e%d*#Bp1 zH<=hkhIg-dbxm9UFTgvvE4QVSRdOx}(lGE{4==2!|1DF&a^ie090P?#iB{7KE2WkJ zH9m3QQ{vc7V53HNue&u@(&q#Cv%>aH$IEkhOu6GA^BPj_WX~6)N7YQkgvT>J!kmsH z+8sCu6A}K$XUP1}wUYA!Vc558#%(S1y@^sV0XKG;#BW(_Jbto{io%XTxGDC8~ zSf8F!5YysGY^!axeypt z7w5#j8Kt{TG-Ey4%|1EJ+aYE$VRL}?HgW}J*2 z*Ozb22FY2~k^*!u5za-F2vmino}0Z;o(84E%f{@d`NS0s*c0Fnf{6|3JtWMf=*d)h zI&GW0=_@p?^Nd8NJy7Yj{nI0k*zy{5w<>ALn$q1hJ{ap5qN~S+LYQQ3edbQZISjfg zU#)-JSrf17^muywHF#0*M22^kjsBQvaow>_)&zhpo`5WgCv-`SCmr--(Hmi`V^JoI zCoh^CBYhJdeHpWC7 z#uW`%`=LA&KBQE4M(n?1y;HJW)G{X@-stVp+;AChWuFIi^&dyO zgR!I2ox~fqf=R$4>8?u6XMSRB4X)uDs9(~FlaqSPr~Yi5El3agp!6rk_zB^!|1bWt z|1T=&osYb}pO}x;6FdlX_UzP43Ic&l9qe6emvpEQ5dS`{eFWFTBi>p8;MzvRb?Sd& z>Hhif|IDNUixCi~V~zA{Pl7uBJEJPh9ue)Yqj0er98VCGDVhV{6VYZ0o*vC*l*@ z3Pi$XH>ck#Fqkvj0%H{gA*53muKQfXp58ki?;O5uP2$hPESr;Grp5H4Uw$HX-OW<& zfcs~wU;f?ezdNFVN=^x#`9cqm8VLRK}9eN%^2S*Ggh`m7k8>&T*3x@mG z44M$n^Pld}(5ZM)I6f#2lTT+*BHWFwzp3PS{eu%BW2pYb(t z0{j;(TU&EeS1Sj54$o)IKB+6g!Q&(RgW_Mr21v$xI;cUQ&gbjdo%-M7YhVO)0!sAH zf=5u&H}?J@kd?iexhIFEtDWutmHGP;*HjN#0KzlT$RH5bzePZxuYm+m@dV0$@d`Cb zAcccLeG|z4QO$V1g+Lni_@% diff --git a/extensions/modules/file/src/test/java/org/exist/xquery/modules/file/RestBinariesTest.java b/extensions/modules/file/src/test/java/org/exist/xquery/modules/file/RestBinariesTest.java index e9269ad034..473c31f3d8 100644 --- a/extensions/modules/file/src/test/java/org/exist/xquery/modules/file/RestBinariesTest.java +++ b/extensions/modules/file/src/test/java/org/exist/xquery/modules/file/RestBinariesTest.java @@ -58,6 +58,7 @@ import org.exist.http.rest.Value; import org.exist.test.ExistWebServer; import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream; +import org.exist.util.io.InputStreamUtil; import org.exist.xmldb.XmldbURI; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -74,6 +75,7 @@ import java.nio.file.Files; import java.nio.file.Path; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.http.HttpStatus.SC_CREATED; import static org.apache.http.HttpStatus.SC_OK; import static org.exist.TestUtils.ADMIN_DB_PWD; @@ -204,8 +206,12 @@ private HttpResponse postXquery(final String xquery) throws JAXBException, IOExc ).returnResponse(); } - if(response.getStatusLine().getStatusCode() != SC_OK) { - throw new IOException("Unable to query, HTTP response code: " + response.getStatusLine().getStatusCode()); + if (response.getStatusLine().getStatusCode() != SC_OK) { + final String responseBody; + try (final InputStream is = response.getEntity().getContent()) { + responseBody = InputStreamUtil.readString(is, UTF_8); + } + throw new IOException("Unable to query, HTTP response code: " + response.getStatusLine().getStatusCode() + ": " + responseBody); } return response; diff --git a/extensions/modules/mail/pom.xml b/extensions/modules/mail/pom.xml index 263d3d27c2..e30f291996 100644 --- a/extensions/modules/mail/pom.xml +++ b/extensions/modules/mail/pom.xml @@ -259,7 +259,6 @@ src/main/java/org/exist/xquery/modules/mail/MessageListFunctions.java src/main/java/org/exist/xquery/modules/mail/SendEmailFunction.java src/test/java/org/exist/xquery/modules/mail/SendEmailIT.java - src/test/java/org/exist/xquery/modules/mail/Util.java src/test/java/org/exist/xquery/modules/mail/WriteMessageTest.java @@ -271,7 +270,6 @@
${project.parent.relativePath}/../../exist-parent/FDB-backport-to-existdb-LGPL-21-ONLY-license.template.txt
src/test/java/org/exist/xquery/modules/mail/SendEmailIT.java - src/test/java/org/exist/xquery/modules/mail/Util.java src/test/java/org/exist/xquery/modules/mail/WriteMessageTest.java diff --git a/extensions/modules/mail/src/test/java/org/exist/xquery/modules/mail/SendEmailIT.java b/extensions/modules/mail/src/test/java/org/exist/xquery/modules/mail/SendEmailIT.java index 545bcd57e4..934b977b14 100644 --- a/extensions/modules/mail/src/test/java/org/exist/xquery/modules/mail/SendEmailIT.java +++ b/extensions/modules/mail/src/test/java/org/exist/xquery/modules/mail/SendEmailIT.java @@ -56,7 +56,7 @@ import org.exist.util.UUIDGenerator; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XPathException; -import org.exist.xquery.value.Sequence; +import org.exist.xquery.XQueryUtil; import org.junit.Before; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -74,8 +74,6 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static org.exist.util.IPUtil.nextFreePort; -import static org.exist.xquery.modules.mail.Util.executeQuery; -import static org.exist.xquery.modules.mail.Util.withCompiledQuery; import static org.junit.Assert.*; /** @@ -587,15 +585,11 @@ private MimeMessage sendEmailBySmtpDirectConnection(final String message, @Nulla try (final DBBroker broker = pool.getBroker(); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - // execute query - final Boolean sendResult = withCompiledQuery(broker, source, compiledXQuery -> { - final Sequence result = executeQuery(broker, compiledXQuery); - return result.itemAt(0).toJavaObject(boolean.class); - }); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); - assertTrue(sendResult.booleanValue()); + assertTrue(queryResult.result.itemAt(0).toJavaObject(boolean.class)); } // check the SMTP server received the email @@ -670,14 +664,9 @@ private MimeMessage sendEmailByJakartaMail(final String message, final String[] final Txn transaction = pool.getTransactionManager().beginTransaction()) { // execute query - final Boolean sendResult = withCompiledQuery(broker, source, compiledXQuery -> { - executeQuery(broker, compiledXQuery); - return true; - }); + XQueryUtil.query(broker, source, false, null, null, null, null, null); transaction.commit(); - - assertTrue(sendResult.booleanValue()); } // check the SMTP server received the email diff --git a/extensions/modules/mail/src/test/java/org/exist/xquery/modules/mail/Util.java b/extensions/modules/mail/src/test/java/org/exist/xquery/modules/mail/Util.java deleted file mode 100644 index 78a5268757..0000000000 --- a/extensions/modules/mail/src/test/java/org/exist/xquery/modules/mail/Util.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2014, Evolved Binary Ltd - * - * This file was originally ported from FusionDB to eXist-db by - * Evolved Binary, for the benefit of the eXist-db Open Source community. - * Only the ported code as it appears in this file, at the time that - * it was contributed to eXist-db, was re-licensed under The GNU - * Lesser General Public License v2.1 only for use in eXist-db. - * - * This license grant applies only to a snapshot of the code as it - * appeared when ported, it does not offer or infer any rights to either - * updates of this source code or access to the original source code. - * - * The GNU Lesser General Public License v2.1 only license follows. - * - * ===================================================================== - * - * Copyright (C) 2014, Evolved Binary Ltd - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version 2.1. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ -package org.exist.xquery.modules.mail; - -import com.evolvedbinary.j8fu.function.Function2E; -import org.exist.security.PermissionDeniedException; -import org.exist.source.Source; -import org.exist.storage.BrokerPool; -import org.exist.storage.DBBroker; -import org.exist.storage.XQueryPool; -import org.exist.xquery.CompiledXQuery; -import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; -import org.exist.xquery.XQueryContext; -import org.exist.xquery.value.Sequence; - -import javax.annotation.Nullable; -import java.io.IOException; -import java.util.Properties; - -/** - * Tests utility methods. - * - * @author Adam Retter - */ -public class Util { - static Sequence executeQuery(final DBBroker broker, final CompiledXQuery compiledXQuery) throws PermissionDeniedException, XPathException { - final BrokerPool pool = broker.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - return xqueryService.execute(broker, compiledXQuery, null, new Properties()); - } - - static T withCompiledQuery(final DBBroker broker, final Source source, final Function2E op) throws XPathException, PermissionDeniedException, IOException { - final BrokerPool pool = broker.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - final XQueryPool xqueryPool = pool.getXQueryPool(); - final CompiledXQuery compiledQuery = compileQuery(broker, xqueryService, xqueryPool, source); - try { - return op.apply(compiledQuery); - } finally { - if (compiledQuery != null) { - if (compiledQuery.getContext() != null) { - compiledQuery.getContext().runCleanupTasks(); - } - xqueryPool.returnCompiledXQuery(source, compiledQuery); - } - } - } - - static CompiledXQuery compileQuery(final DBBroker broker, final XQuery xqueryService, final XQueryPool xqueryPool, final Source query) throws PermissionDeniedException, XPathException, IOException { - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - compiled = xqueryPool.borrowCompiledXQuery(broker, query); - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - if (compiled == null) { - compiled = xqueryService.compile(context, query); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } - - return compiled; - - } catch (final PermissionDeniedException | XPathException | IOException e) { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - xqueryPool.returnCompiledXQuery(query, compiled); - } - throw e; - } - } -} diff --git a/extensions/modules/sql/pom.xml b/extensions/modules/sql/pom.xml index 0798663a4e..bddf7b3721 100644 --- a/extensions/modules/sql/pom.xml +++ b/extensions/modules/sql/pom.xml @@ -189,6 +189,7 @@ src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml src/main/java/org/exist/xquery/modules/sql/ExecuteFunction.java + src/test/java/org/exist/xquery/modules/sql/ExecuteIT.java @@ -206,6 +207,7 @@ src/test/java/org/exist/xquery/modules/sql/ConnectionIT.java src/test/java/org/exist/xquery/modules/sql/ConnectionPoolIT.java src/main/java/org/exist/xquery/modules/sql/ExecuteFunction.java + src/test/java/org/exist/xquery/modules/sql/ExecuteIT.java src/main/java/org/exist/xquery/modules/sql/GetConnectionFunction.java src/test/java/org/exist/xquery/modules/sql/H2DatabaseResource.java src/test/java/org/exist/xquery/modules/sql/ImplicitConnectionCloseIT.java diff --git a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ConnectionIT.java b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ConnectionIT.java index 5327824e52..d269456288 100644 --- a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ConnectionIT.java +++ b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ConnectionIT.java @@ -62,8 +62,8 @@ import static com.evolvedbinary.j8fu.tuple.Tuple.Tuple; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.exist.xquery.modules.sql.Util.executeQuery; -import static org.exist.xquery.modules.sql.Util.withCompiledQuery; +import static org.exist.xquery.XQueryUtil.executeQuery; +import static org.exist.xquery.XQueryUtil.withCompiledQuery; import static org.junit.Assert.*; /** diff --git a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ConnectionPoolIT.java b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ConnectionPoolIT.java index dd2bf5cf91..c47fc6c782 100644 --- a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ConnectionPoolIT.java +++ b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ConnectionPoolIT.java @@ -32,7 +32,6 @@ */ package org.exist.xquery.modules.sql; -import com.evolvedbinary.j8fu.tuple.Tuple2; import org.exist.EXistException; import org.exist.security.PermissionDeniedException; import org.exist.source.Source; @@ -53,9 +52,8 @@ import java.io.IOException; import java.util.Map; -import static com.evolvedbinary.j8fu.tuple.Tuple.Tuple; -import static org.exist.xquery.modules.sql.Util.executeQuery; -import static org.exist.xquery.modules.sql.Util.withCompiledQuery; +import static org.exist.xquery.XQueryUtil.executeQuery; +import static org.exist.xquery.XQueryUtil.withCompiledQuery; import static org.junit.Assert.*; public class ConnectionPoolIT { diff --git a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ExecuteIT.java b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ExecuteIT.java index 2aee85fc2f..b7542cbe03 100644 --- a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ExecuteIT.java +++ b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ExecuteIT.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -21,7 +45,6 @@ */ package org.exist.xquery.modules.sql; -import com.evolvedbinary.j8fu.tuple.Tuple2; import org.exist.EXistException; import org.exist.dom.memtree.ElementImpl; import org.exist.security.PermissionDeniedException; @@ -32,8 +55,7 @@ import org.exist.storage.txn.Txn; import org.exist.test.ExistEmbeddedServer; import org.exist.xquery.XPathException; -import org.exist.xquery.XQueryContext; -import org.exist.xquery.value.Sequence; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Type; import org.junit.Rule; import org.junit.Test; @@ -41,9 +63,6 @@ import java.io.IOException; -import static com.evolvedbinary.j8fu.tuple.Tuple.Tuple; -import static org.exist.xquery.modules.sql.Util.executeQuery; -import static org.exist.xquery.modules.sql.Util.withCompiledQuery; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -82,23 +101,16 @@ private void executeForNS(final String namespace, final String prefix) throws EX try (final DBBroker broker = pool.getBroker(); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final Tuple2 namespaceAndPrefix = withCompiledQuery(broker, mainQuerySource, mainCompiledQuery -> { - final XQueryContext mainQueryContext = mainCompiledQuery.getContext(); - - // execute the query - final Sequence result = executeQuery(broker, mainCompiledQuery); - - // check that the namespace of the result element is in the 'sql' namespace - assertEquals(1, result.getItemCount()); - assertTrue(result.itemAt(0) instanceof Element); - assertEquals(Type.ELEMENT, result.itemAt(0).getType()); - final Element element = (ElementImpl) result.itemAt(0); - - return Tuple(element.getNamespaceURI(), element.getPrefix()); - }); + // execute the query + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, mainQuerySource, false, null, null, null, null, null); - assertEquals(namespace, namespaceAndPrefix._1); - assertEquals(prefix, namespaceAndPrefix._2); + // check that the namespace of the result element is in the 'sql' namespace + assertEquals(1, queryResult.result.getItemCount()); + assertTrue(queryResult.result.itemAt(0) instanceof Element); + assertEquals(Type.ELEMENT, queryResult.result.itemAt(0).getType()); + final Element element = (ElementImpl) queryResult.result.itemAt(0); + assertEquals(namespace, element.getNamespaceURI()); + assertEquals(prefix, element.getPrefix()); transaction.commit(); } diff --git a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ImplicitConnectionCloseIT.java b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ImplicitConnectionCloseIT.java index ed6aa34772..9ad446a41e 100644 --- a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ImplicitConnectionCloseIT.java +++ b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ImplicitConnectionCloseIT.java @@ -48,7 +48,6 @@ import org.exist.xmldb.XmldbURI; import org.exist.xquery.ExternalModule; -import org.exist.xquery.Module; import org.exist.xquery.ModuleContext; import org.exist.xquery.XPathException; import org.exist.xquery.XQueryContext; @@ -77,8 +76,8 @@ import static com.evolvedbinary.j8fu.tuple.Tuple.Tuple; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.exist.xquery.modules.sql.Util.executeQuery; -import static org.exist.xquery.modules.sql.Util.withCompiledQuery; +import static org.exist.xquery.XQueryUtil.executeQuery; +import static org.exist.xquery.XQueryUtil.withCompiledQuery; import static org.junit.Assert.*; import static org.junit.Assert.assertEquals; diff --git a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/JndiConnectionIT.java b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/JndiConnectionIT.java index dfffaf525b..ce758fb050 100644 --- a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/JndiConnectionIT.java +++ b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/JndiConnectionIT.java @@ -71,8 +71,8 @@ import static com.evolvedbinary.j8fu.tuple.Tuple.Tuple; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.exist.xquery.modules.sql.Util.executeQuery; -import static org.exist.xquery.modules.sql.Util.withCompiledQuery; +import static org.exist.xquery.XQueryUtil.executeQuery; +import static org.exist.xquery.XQueryUtil.withCompiledQuery; import static org.junit.Assert.*; /** diff --git a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/Util.java b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/Util.java index de4dc987f6..1e2be95df2 100644 --- a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/Util.java +++ b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/Util.java @@ -54,58 +54,5 @@ * @author Adam Retter */ public class Util { - static Sequence executeQuery(final DBBroker broker, final CompiledXQuery compiledXQuery) throws PermissionDeniedException, XPathException { - final BrokerPool pool = broker.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - return xqueryService.execute(broker, compiledXQuery, null, new Properties()); - } - static T withCompiledQuery(final DBBroker broker, final Source source, final Function2E op) throws XPathException, PermissionDeniedException, IOException { - final BrokerPool pool = broker.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); - final XQueryPool xqueryPool = pool.getXQueryPool(); - final CompiledXQuery compiledQuery = compileQuery(broker, xqueryService, xqueryPool, source); - try { - return op.apply(compiledQuery); - } finally { - if (compiledQuery != null) { - if (compiledQuery.getContext() != null) { - compiledQuery.getContext().runCleanupTasks(); - } - xqueryPool.returnCompiledXQuery(source, compiledQuery); - } - } - } - - static CompiledXQuery compileQuery(final DBBroker broker, final XQuery xqueryService, final XQueryPool xqueryPool, final Source query) throws PermissionDeniedException, XPathException, IOException { - @Nullable CompiledXQuery compiled = null; - @Nullable XQueryContext context = null; - try { - compiled = xqueryPool.borrowCompiledXQuery(broker, query); - if (compiled == null) { - context = new XQueryContext(broker.getBrokerPool()); - } else { - context = compiled.getContext(); - context.prepareForReuse(); - } - - if (compiled == null) { - compiled = xqueryService.compile(context, query); - } else { - compiled.getContext().updateContext(context); - context.getWatchDog().reset(); - } - - return compiled; - - } catch (final PermissionDeniedException | XPathException | IOException e) { - if (context != null) { - context.runCleanupTasks(); - } - if (compiled != null) { - xqueryPool.returnCompiledXQuery(query, compiled); - } - throw e; - } - } } diff --git a/extensions/modules/xslfo/pom.xml b/extensions/modules/xslfo/pom.xml index d9a00a32f9..7bf7bb96c3 100644 --- a/extensions/modules/xslfo/pom.xml +++ b/extensions/modules/xslfo/pom.xml @@ -81,6 +81,12 @@ ${project.version}
+ + com.evolvedbinary.j8fu + j8fu + test + + com.google.code.findbugs jsr305 @@ -191,6 +197,7 @@ src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml src/main/java/org/exist/xquery/modules/xslfo/ApacheFopProcessorAdapter.java + src/test/java/org/exist/xquery/modules/xslfo/ApacheFopTest.java src/main/java/org/exist/xquery/modules/xslfo/RenderXXepProcessorAdapter.java @@ -205,6 +212,7 @@ src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml src/main/java/org/exist/xquery/modules/xslfo/ApacheFopProcessorAdapter.java + src/test/java/org/exist/xquery/modules/xslfo/ApacheFopTest.java src/main/java/org/exist/xquery/modules/xslfo/RenderXXepProcessorAdapter.java diff --git a/extensions/modules/xslfo/src/test/java/org/exist/xquery/modules/xslfo/ApacheFopTest.java b/extensions/modules/xslfo/src/test/java/org/exist/xquery/modules/xslfo/ApacheFopTest.java index 1d6564911d..a0c793affc 100644 --- a/extensions/modules/xslfo/src/test/java/org/exist/xquery/modules/xslfo/ApacheFopTest.java +++ b/extensions/modules/xslfo/src/test/java/org/exist/xquery/modules/xslfo/ApacheFopTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -23,17 +47,19 @@ import org.exist.EXistException; import org.exist.security.PermissionDeniedException; +import org.exist.source.StringSource; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; import org.exist.test.ExistEmbeddedServer; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.Item; -import org.exist.xquery.value.Sequence; import org.exist.xquery.value.Type; import org.junit.ClassRule; import org.junit.Test; +import java.io.IOException; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -43,7 +69,7 @@ public class ApacheFopTest { public static final ExistEmbeddedServer server = new ExistEmbeddedServer(true, true); @Test - public void simplePdf() throws EXistException, PermissionDeniedException, XPathException { + public void simplePdf() throws EXistException, PermissionDeniedException, XPathException, IOException { final String fopConfig = "\n" + " true\n" + @@ -85,7 +111,7 @@ public void simplePdf() throws EXistException, PermissionDeniedException, XPathE " \n" + ""; - final String xquery = + final String query = "xquery version \"3.1\";\n" + "\n" + "import module namespace xslfo=\"http://exist-db.org/xquery/xslfo\";\n" + @@ -97,13 +123,12 @@ public void simplePdf() throws EXistException, PermissionDeniedException, XPathE "return $pdf"; final BrokerPool pool = server.getBrokerPool(); - final XQuery xqueryService = pool.getXQueryService(); try (final DBBroker broker = pool.getBroker()) { - final Sequence result = xqueryService.execute(broker, xquery, null); - assertNotNull(result); - assertEquals(1, result.getItemCount()); - final Item pdf = result.itemAt(0); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Item pdf = queryResult.result.itemAt(0); assertEquals(Type.BASE64_BINARY, pdf.getType()); } } diff --git a/extensions/security/iprange/pom.xml b/extensions/security/iprange/pom.xml index 9f26c51f7f..f816aaad7f 100644 --- a/extensions/security/iprange/pom.xml +++ b/extensions/security/iprange/pom.xml @@ -103,6 +103,7 @@ pom.xml + src/main/java/org/exist/security/realm/iprange/IPRangeRealm.java src/main/java/org/exist/security/realm/iprange/IPRangeServlet.java @@ -114,6 +115,7 @@
${project.parent.relativePath}/../../exist-parent/existdb-LGPL-21-license.template.txt
pom.xml + src/main/java/org/exist/security/realm/iprange/IPRangeRealm.java src/main/java/org/exist/security/realm/iprange/IPRangeServlet.java @@ -140,6 +142,11 @@ ${project.version}
+ + com.evolvedbinary.j8fu + j8fu + + org.apache.logging.log4j log4j-api diff --git a/extensions/security/iprange/src/main/java/org/exist/security/realm/iprange/IPRangeRealm.java b/extensions/security/iprange/src/main/java/org/exist/security/realm/iprange/IPRangeRealm.java index 91a92596d8..44f478af03 100644 --- a/extensions/security/iprange/src/main/java/org/exist/security/realm/iprange/IPRangeRealm.java +++ b/extensions/security/iprange/src/main/java/org/exist/security/realm/iprange/IPRangeRealm.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -21,26 +45,26 @@ */ package org.exist.security.realm.iprange; +import com.evolvedbinary.j8fu.function.ConsumerE; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.EXistException; import org.exist.config.Configuration; -import org.exist.config.ConfigurationException; import org.exist.config.annotation.ConfigurationClass; import org.exist.config.annotation.ConfigurationFieldAsAttribute; import org.exist.security.*; import org.exist.security.internal.SecurityManagerImpl; import org.exist.security.internal.SubjectAccreditedImpl; +import org.exist.source.Source; +import org.exist.source.StringSource; import org.exist.storage.DBBroker; -import org.exist.xquery.CompiledXQuery; import org.exist.xquery.XPathException; -import org.exist.xquery.XQuery; import org.exist.xquery.XQueryContext; -import org.exist.xquery.value.Sequence; -import org.exist.xquery.value.SequenceIterator; +import org.exist.xquery.XQueryUtil; +import org.exist.xquery.value.*; +import java.io.IOException; import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.Optional; import java.util.Properties; @@ -59,7 +83,14 @@ public class IPRangeRealm extends AbstractRealm { private final static Logger LOG = LogManager.getLogger(IPRangeRealm.class); private static IPRangeRealm instance = null; - public IPRangeRealm(final SecurityManagerImpl sm, final Configuration config) throws ConfigurationException { + private static final String IP_VARIABLE_NAME = "ip"; + + private static final Source QUERY = new StringSource( + "declare variable $" + IP_VARIABLE_NAME + " as xs:long external;\n" + + "fn:collection('/db/system/security/iprange/accounts')/account/iprange[$ip ge number(start)][$ip le number(end)]/../name" + ); + + public IPRangeRealm(final SecurityManagerImpl sm, final Configuration config) { super(sm, config); instance = this; } @@ -78,25 +109,18 @@ private static long ipToLong(final InetAddress ip) { return result; } - /*@Override - public void start(DBBroker broker) throws EXistException { - super.start(broker); - }*/ - @Override public String getId() { return ID; } @Override - public boolean deleteAccount(final Account account) throws PermissionDeniedException, EXistException, ConfigurationException { - // Auto-generated method stub + public boolean deleteAccount(final Account account) { return false; } @Override - public boolean deleteGroup(final Group group) throws PermissionDeniedException, EXistException, ConfigurationException { - // Auto-generated method stub + public boolean deleteGroup(final Group group) { return false; } @@ -109,25 +133,14 @@ public Subject authenticate(final String ipAddress, final Object credentials) th // Convert IP address final long ipToTest = ipToLong(InetAddress.getByName(ipAddress)); - // Get xquery service - final XQuery queryService = broker.getBrokerPool().getXQueryService(); - if (queryService == null) { - LOG.error("IPRange broker unable to retrieve XQueryService"); - return null; - } - - // Construct XQuery - final String query = "collection('/db/system/security/iprange/accounts')/account/" + - "iprange[" + ipToTest + " ge number(start) and " + ipToTest + " le number(end)]/../name"; - final XQueryContext context = new XQueryContext(broker.getBrokerPool()); - - final CompiledXQuery compiled = queryService.compile(context, query); - - final Properties outputProperties = new Properties(); + final ConsumerE setupXqueryContextPreExecution = xqueryContext -> { + xqueryContext.declareVariable(IP_VARIABLE_NAME, new IntegerValue(ipToTest, Type.LONG)); + }; // Execute xQuery - final Sequence result = queryService.execute(broker, compiled, null, outputProperties); - final SequenceIterator i = result.iterate(); + final Properties outputProperties = new Properties(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, QUERY, true, null, outputProperties, null, setupXqueryContextPreExecution, null); + final SequenceIterator i = queryResult.result.iterate(); // Get FIRST username when present final String username = i.hasNext() ? i.nextItem().getStringValue() : ""; @@ -150,7 +163,7 @@ public Subject authenticate(final String ipAddress, final Object credentials) th } return null; - } catch (final EXistException | UnknownHostException | XPathException | PermissionDeniedException e) { + } catch (final EXistException | IOException | XPathException | PermissionDeniedException e) { throw new AuthenticationException(AuthenticationException.UNNOWN_EXCEPTION, e.getMessage()); } } From 9bd731f80e07834939c52e7c0ddfd7084e961ef4 Mon Sep 17 00:00:00 2001 From: Adam Retter Date: Sat, 14 Feb 2026 16:33:17 +0100 Subject: [PATCH 2/5] [refactor] Allow caller control over lifetime of the result sequence, as only they can know when they are finished with it --- exist-core/pom.xml | 10 +- .../triggers/XQueryStartupTrigger.java | 6 +- .../collections/triggers/XQueryTrigger.java | 6 +- .../exist/http/AuditTrailSessionListener.java | 7 +- .../main/java/org/exist/http/RESTServer.java | 57 +- .../http/servlets/RedirectorServlet.java | 90 +- .../exist/http/servlets/XQueryServlet.java | 79 +- .../http/urlrewrite/XQueryURLRewrite.java | 159 +- .../java/org/exist/launcher/Launcher.java | 18 +- .../exist/management/impl/SanityReport.java | 4 +- .../main/java/org/exist/repo/Deployment.java | 26 +- .../org/exist/scheduler/UserXQueryJob.java | 4 +- .../storage/serializers/XIncludeFilter.java | 33 +- .../org/exist/test/TransactionTestDSL.java | 8 +- .../java/org/exist/test/XQueryAssertions.java | 40 +- .../org/exist/test/XQueryCompilationTest.java | 35 +- .../exist/test/runner/AbstractTestRunner.java | 9 +- .../internal/DatabaseResources.java | 51 +- .../org/exist/xmldb/LocalResourceSet.java | 18 +- .../exist/xmldb/LocalXPathQueryService.java | 92 +- .../java/org/exist/xquery/XQueryUtil.java | 52 +- .../java/org/exist/xupdate/Conditional.java | 39 +- .../java/org/exist/xupdate/Modification.java | 27 +- .../org/exist/xupdate/XUpdateProcessor.java | 66 +- .../src/test/java/org/exist/Indexer2Test.java | 5 +- .../src/test/java/org/exist/Indexer3Test.java | 5 +- .../src/test/java/org/exist/IndexerTest.java | 5 +- .../triggers/XQueryTriggerSetGidTest.java | 36 +- .../triggers/XQueryTriggerSetUidTest.java | 36 +- .../org/exist/dom/memtree/DOMIndexerTest.java | 5 +- .../dom/persistent/BasicNodeSetTest.java | 385 ++--- .../org/exist/numbering/DLNStorageTest.java | 81 +- .../security/FnCollectionSecurityTest.java | 25 +- .../org/exist/security/FnDocSecurityTest.java | 20 +- .../exist/security/SecurityManagerTest.java | 12 +- .../org/exist/security/XqueryApiTest.java | 38 +- .../org/exist/storage/AbstractUpdateTest.java | 8 +- .../exist/storage/RangeIndexUpdateTest.java | 8 +- .../java/org/exist/storage/RecoveryTest.java | 13 +- .../java/org/exist/storage/ShutdownTest.java | 8 +- .../org/exist/xquery/AbsolutePathTests.java | 59 +- .../java/org/exist/xquery/CleanupTest.java | 5 +- .../xquery/ConstructedNodesRecoveryTest.java | 12 +- .../exist/xquery/ForwardReferenceTest.java | 20 +- .../FunctionTypeInElementContentTest.java | 32 +- .../org/exist/xquery/ImportModuleTest.java | 476 +++--- .../org/exist/xquery/JavaBindingTest.java | 407 ++--- .../xquery/XQueryDeclareContextItemTest.java | 43 +- .../java/org/exist/xquery/XQueryTest.java | 27 +- .../org/exist/xquery/XQueryUpdateTest.java | 319 ++-- .../xquery/functions/fn/CollectionTest.java | 60 +- .../exist/xquery/functions/fn/DocTest.java | 95 +- .../functions/fn/FunUnparsedTextTest.java | 55 +- .../fn/transform/FunTransformITTest.java | 5 +- .../functions/inspect/InspectModuleTest.java | 134 +- ...ntManagementFunctionRemoveAccountTest.java | 14 +- .../AccountMetadataFunctionsTest.java | 10 +- .../securitymanager/GetPermissionsTest.java | 5 +- ...roupManagementFunctionRemoveGroupTest.java | 6 +- ...mbershipFunctionRemoveGroupMemberTest.java | 16 +- .../PermissionsFunctionChownTest.java | 10 +- .../SecurityManagerTestUtil.java | 22 +- .../functions/transform/TransformTest.java | 20 +- .../xquery/functions/util/ParseHtmlTest.java | 5 +- .../functions/xquery3/SerializeTest.java | 5 +- .../UpdateInsertTriggersDefragTest.java | 7 +- .../xquery/ContentFunctionsTest.java | 31 +- .../java/org/expath/exist/HttpClientTest.java | 10 +- .../exist/indexing/EnforceIndexUseTest.java | 5 +- .../indexing/lucene/LuceneIndexTest.java | 478 +++--- .../lucene/LuceneMatchListenerTest.java | 179 ++- .../lucene/SerializeAttrMatchesTest.java | 5 +- .../exist/indexing/ngram/CustomIndexTest.java | 174 ++- .../indexing/ngram/MatchListenerTest.java | 417 ++--- .../exist/indexing/spatial/GMLIndexTest.java | 1377 +++++++++-------- .../xquery/modules/cache/LazyCacheTest.java | 21 +- .../modules/cache/NonLazyCacheTest.java | 10 +- .../org/exist/repo/ExampleModuleTest.java | 56 +- .../org/exist/repo/PackageTriggerTest.java | 25 +- .../xquery/modules/mail/SendEmailIT.java | 11 +- .../exist/xquery/modules/sql/ExecuteIT.java | 17 +- .../xquery/modules/xslfo/ApacheFopTest.java | 11 +- .../security/realm/iprange/IPRangeRealm.java | 35 +- 83 files changed, 3570 insertions(+), 2787 deletions(-) diff --git a/exist-core/pom.xml b/exist-core/pom.xml index 15ac113db0..9271ddc021 100644 --- a/exist-core/pom.xml +++ b/exist-core/pom.xml @@ -1102,7 +1102,8 @@ src/test/java/org/exist/storage/util/PauseFunction.java src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java src/main/java/org/exist/test/TransactionTestDSL.java - src/test/java/org/exist/test/XQueryCompilationTest.java + src/main/java/org/exist/test/XQueryAssertions.java + src/main/java/org/exist/test/XQueryCompilationTest.java src/main/java/org/exist/test/runner/AbstractTestRunner.java src/main/java/org/exist/test/runner/ExtTestAssumptionFailedFunction.java src/main/java/org/exist/test/runner/ExtTestErrorFunction.java @@ -1216,6 +1217,7 @@ src/test/java/org/exist/xmlrpc/XmlRpcTest.java src/main/java/org/exist/xqj/Marshaller.java src/test/java/org/exist/xqj/MarshallerTest.java + src/test/java/org/exist/xquery/AbsolutePathTests.java src/main/java/org/exist/xquery/AbstractInternalModule.java src/main/java/org/exist/xquery/ArrowOperator.java src/test/java/org/exist/xquery/CardinalityTest.java @@ -1235,6 +1237,7 @@ src/test/java/org/exist/xquery/ForwardReferenceTest.java src/main/java/org/exist/xquery/Function.java src/main/java/org/exist/xquery/FunctionFactory.java + src/test/java/org/exist/xquery/FunctionTypeInElementContentTest.java src/main/java/org/exist/xquery/InlineFunction.java src/main/java/org/exist/xquery/Intersect.java src/test/java/org/exist/xquery/LexerTest.java @@ -1908,7 +1911,8 @@ src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java src/main/java/org/exist/test/TransactionTestDSL.java src/test/java/org/exist/test/Util.java - src/test/java/org/exist/test/XQueryCompilationTest.java + src/main/java/org/exist/test/XQueryAssertions.java + src/main/java/org/exist/test/XQueryCompilationTest.java src/main/java/org/exist/test/runner/AbstractTestRunner.java src/main/java/org/exist/test/runner/ExtTestAssumptionFailedFunction.java src/main/java/org/exist/test/runner/ExtTestErrorFunction.java @@ -2039,6 +2043,7 @@ src/test/java/org/exist/xmlrpc/XmlRpcTest.java src/main/java/org/exist/xqj/Marshaller.java src/test/java/org/exist/xqj/MarshallerTest.java + src/test/java/org/exist/xquery/AbsolutePathTests.java src/main/java/org/exist/xquery/AbstractInternalModule.java src/main/java/org/exist/xquery/ArrowOperator.java src/test/java/org/exist/xquery/ArrowOperatorTest.java @@ -2061,6 +2066,7 @@ src/test/java/org/exist/xquery/ForwardReferenceTest.java src/main/java/org/exist/xquery/Function.java src/main/java/org/exist/xquery/FunctionFactory.java + src/test/java/org/exist/xquery/FunctionTypeInElementContentTest.java src/test/resources-filtered/org/exist/xquery/import-from-pkg-test.conf.xml src/test/java/org/exist/xquery/ImportFromPkgTest.java src/test/java/org/exist/xquery/ImportModuleTest.java diff --git a/exist-core/src/main/java/org/exist/collections/triggers/XQueryStartupTrigger.java b/exist-core/src/main/java/org/exist/collections/triggers/XQueryStartupTrigger.java index 12dd1141e8..446e7138a1 100644 --- a/exist-core/src/main/java/org/exist/collections/triggers/XQueryStartupTrigger.java +++ b/exist-core/src/main/java/org/exist/collections/triggers/XQueryStartupTrigger.java @@ -283,9 +283,9 @@ private void executeQuery(final DBBroker broker, final String path) { LOG.info("Executing XQuery Startup Trigger: {}", path); - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, setupXqueryContextPreCompilation, null, null); - - LOG.info("Executed XQuery Startup Trigger: {} in {}", path, queryResult.executionTime); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, setupXqueryContextPreCompilation, null, null)) { + LOG.info("Executed XQuery Startup Trigger: {} in {}", path, queryResult.executionTime); + } } } catch (final Throwable t) { diff --git a/exist-core/src/main/java/org/exist/collections/triggers/XQueryTrigger.java b/exist-core/src/main/java/org/exist/collections/triggers/XQueryTrigger.java index 20550f8acd..32e6bed75d 100644 --- a/exist-core/src/main/java/org/exist/collections/triggers/XQueryTrigger.java +++ b/exist-core/src/main/java/org/exist/collections/triggers/XQueryTrigger.java @@ -263,8 +263,7 @@ private void prepare(final TriggerEvent event, final DBBroker broker, final Txn declareExternalVariables(xqueryContext, TriggerPhase.BEFORE, event, src, dst, isCollection); }; - try { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreExecution, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreExecution, null, null)) { if (LOG.isDebugEnabled()) { LOG.debug("Trigger fired for prepare in: {}", queryResult.executionTime); @@ -296,8 +295,7 @@ private void finish(final TriggerEvent event, final DBBroker broker, final Txn t }; long executionTime = -1; - try { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreExecution, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreExecution, null, null)) { executionTime = queryResult.executionTime; } catch (final XPathException | IOException | PermissionDeniedException e) { LOG.error("Error during trigger finish", e); diff --git a/exist-core/src/main/java/org/exist/http/AuditTrailSessionListener.java b/exist-core/src/main/java/org/exist/http/AuditTrailSessionListener.java index faa0237f30..1d05b55da3 100644 --- a/exist-core/src/main/java/org/exist/http/AuditTrailSessionListener.java +++ b/exist-core/src/main/java/org/exist/http/AuditTrailSessionListener.java @@ -150,10 +150,11 @@ private void executeXQuery(String xqueryResourcePath) { }; final Properties outputProperties = new Properties(); - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, outputProperties, setupXqueryContextPreCompilation, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, outputProperties, setupXqueryContextPreCompilation, null, null)) { - if (LOG.isTraceEnabled()) { - LOG.trace("XQuery execution results: {} in {}ms.", queryResult.result.toString(), queryResult.executionTime); + if (LOG.isTraceEnabled()) { + LOG.trace("XQuery execution results: {} in {}ms.", queryResult.result.toString(), queryResult.executionTime); + } } } } diff --git a/exist-core/src/main/java/org/exist/http/RESTServer.java b/exist-core/src/main/java/org/exist/http/RESTServer.java index 8df93de9f8..90683a2cf9 100644 --- a/exist-core/src/main/java/org/exist/http/RESTServer.java +++ b/exist-core/src/main/java/org/exist/http/RESTServer.java @@ -1409,24 +1409,25 @@ protected void search(final DBBroker broker, final Txn transaction, final String @Nullable final Item contextItem = extractContextItem(contextItemParam); final Sequence contextSequence = contextItem != null ? new ValueSequence(contextItem) : null; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, contextSequence, outputProperties, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, setupXqueryContextPostExecution); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, contextSequence, outputProperties, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, setupXqueryContextPostExecution)) { - // special header to indicate that the query is not returned from cache - response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); + // special header to indicate that the query is not returned from cache + response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); - if (LOG.isDebugEnabled()) { - LOG.debug("Found {} in {}ms.", queryResult.result.getItemCount(), queryResult.executionTime); - } + if (LOG.isDebugEnabled()) { + LOG.debug("Found {} in {}ms.", queryResult.result.getItemCount(), queryResult.executionTime); + } - if (cache) { - final int sessionId = sessionManager.add(query, queryResult); - outputProperties.setProperty(Serializer.PROPERTY_SESSION_ID, Integer.toString(sessionId)); - if (!response.isCommitted()) { - response.setIntHeader(SESSION_ID_HEADER, sessionId); + if (cache) { + final int sessionId = sessionManager.add(query, queryResult); + outputProperties.setProperty(Serializer.PROPERTY_SESSION_ID, Integer.toString(sessionId)); + if (!response.isCommitted()) { + response.setIntHeader(SESSION_ID_HEADER, sessionId); + } } - } - writeResults(response, broker, transaction, queryResult, howmany, start, typed, outputProperties, wrap); + writeResults(response, broker, transaction, queryResult, howmany, start, typed, outputProperties, wrap); + } } catch (final IOException e) { throw new BadRequestException(e.getMessage(), e); @@ -1623,18 +1624,16 @@ private void executeXQuery(final DBBroker broker, final Txn transaction, final D HTTPUtils.addLastModifiedHeader(queryResult.result, xqueryContext); }; - final XQueryUtil.QueryResult queryResult; - try { - queryResult = XQueryUtil.query(broker, source, true, null, outputProperties, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, setupXqueryContextPostExecution); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, outputProperties, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, setupXqueryContextPostExecution)) { + + // Special header to indicate whether the compiled query is returned from the cache + response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); + + final boolean wrap = "yes".equals(outputProperties.getProperty("_wrap")); + writeResults(response, broker, transaction, queryResult, -1, 1, false, outputProperties, wrap); } catch (final IOException e) { throw new BadRequestException("Failed to read query from " + resource.getURI(), e); } - - // Special header to indicate whether the compiled query is returned from the cache - response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); - - final boolean wrap = "yes".equals(outputProperties.getProperty("_wrap")); - writeResults(response, broker, transaction, queryResult, -1, 1, false, outputProperties, wrap); } /** @@ -1684,17 +1683,15 @@ private void executeXProc(final DBBroker broker, final Txn transaction, final Do }; // execute query - final XQueryUtil.QueryResult queryResult; - try { - queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, setupXqueryContextPostExecution); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, setupXqueryContextPostExecution)) { + + // special header to indicate that the query is not returned from cache + response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); + + writeResults(response, broker, transaction, queryResult, -1, 1, false, outputProperties, false); } catch (final IOException e) { throw new BadRequestException("Failed to read query from " + source.getURL(), e); } - - // special header to indicate that the query is not returned from cache - response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); - - writeResults(response, broker, transaction, queryResult, -1, 1, false, outputProperties, false); } public void setCreatedAndLastModifiedHeaders( diff --git a/exist-core/src/main/java/org/exist/http/servlets/RedirectorServlet.java b/exist-core/src/main/java/org/exist/http/servlets/RedirectorServlet.java index f1c8888057..e195cae931 100644 --- a/exist-core/src/main/java/org/exist/http/servlets/RedirectorServlet.java +++ b/exist-core/src/main/java/org/exist/http/servlets/RedirectorServlet.java @@ -58,7 +58,6 @@ import org.exist.xquery.XPathException; import org.exist.xquery.XQueryContext; import org.exist.xquery.XQueryUtil; -import org.exist.xquery.value.Sequence; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -190,59 +189,60 @@ protected void service(final HttpServletRequest req, final HttpServletResponse r final FileSource source = new FileSource(p, true); try { - // Prepare and execute the XQuery - final Sequence result = executeQuery(source, request, response); - String redirectTo = null; String servletName = null; String path = null; ModifiableRequestWrapper modifiedRequest = null; - // parse the query result element - if (result != null && result.getItemCount() == 1) { - Node node = (Node)result.itemAt(0); - if (node.getNodeType() == Node.DOCUMENT_NODE) { - node = ((Document) node).getDocumentElement(); - } - if (node.getNodeType() != Node.ELEMENT_NODE) { - response.sendError(HttpServletResponse.SC_BAD_REQUEST, + + // Execute the XQuery + try (final XQueryUtil.QueryResult queryResult = executeQuery(source, request, response)) { + // parse the query result element + if (queryResult.result != null && queryResult.result.getItemCount() == 1) { + Node node = (Node) queryResult.result.itemAt(0); + if (node.getNodeType() == Node.DOCUMENT_NODE) { + node = ((Document) node).getDocumentElement(); + } + if (node.getNodeType() != Node.ELEMENT_NODE) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Redirect XQuery should return an XML element. Received: " + node); - return; - } - Element elem = (Element) node; - final String ns = elem.getNamespaceURI(); - if (ns == null || ((!Namespaces.EXIST_NS.equals(ns)) && "dispatch".equals(elem.getLocalName()))) { - response.sendError(HttpServletResponse.SC_BAD_REQUEST, + return; + } + Element elem = (Element) node; + final String ns = elem.getNamespaceURI(); + if (ns == null || ((!Namespaces.EXIST_NS.equals(ns)) && "dispatch".equals(elem.getLocalName()))) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Redirect XQuery should return an element . Received: " + node); - return; - } - if (elem.hasAttribute("path")) { - path = elem.getAttribute("path"); - } else if (elem.hasAttribute("servlet-name")) { - servletName = elem.getAttribute("servlet-name"); - } else if (elem.hasAttribute("redirect")) { - redirectTo = elem.getAttribute("redirect"); - } else { - response.sendError(HttpServletResponse.SC_BAD_REQUEST, + return; + } + if (elem.hasAttribute("path")) { + path = elem.getAttribute("path"); + } else if (elem.hasAttribute("servlet-name")) { + servletName = elem.getAttribute("servlet-name"); + } else if (elem.hasAttribute("redirect")) { + redirectTo = elem.getAttribute("redirect"); + } else { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Element should either provide an attribute 'path' or 'servlet-name'. Received: " + - node); - return; - } + node); + return; + } - // Check for add-parameter elements etc. - if (elem.hasChildNodes()) { - node = elem.getFirstChild(); - while (node != null) { - final String nsUri = node.getNamespaceURI(); - if (node.getNodeType() == Node.ELEMENT_NODE && nsUri != null && Namespaces.EXIST_NS.equals(nsUri)) { - elem = (Element) node; - if ("add-parameter".equals(elem.getLocalName())) { - if (modifiedRequest == null) { - modifiedRequest = new ModifiableRequestWrapper(req); + // Check for add-parameter elements etc. + if (elem.hasChildNodes()) { + node = elem.getFirstChild(); + while (node != null) { + final String nsUri = node.getNamespaceURI(); + if (node.getNodeType() == Node.ELEMENT_NODE && nsUri != null && Namespaces.EXIST_NS.equals(nsUri)) { + elem = (Element) node; + if ("add-parameter".equals(elem.getLocalName())) { + if (modifiedRequest == null) { + modifiedRequest = new ModifiableRequestWrapper(req); + } + modifiedRequest.addParameter(elem.getAttribute("name"), elem.getAttribute("value")); } - modifiedRequest.addParameter(elem.getAttribute("name"), elem.getAttribute("value")); } + node = node.getNextSibling(); } - node = node.getNextSibling(); } } } @@ -290,7 +290,7 @@ protected void service(final HttpServletRequest req, final HttpServletResponse r } } - private Sequence executeQuery(final Source source, final RequestWrapper request, final ResponseWrapper response) throws EXistException, XPathException, PermissionDeniedException, IOException { + private XQueryUtil.QueryResult executeQuery(final Source source, final RequestWrapper request, final ResponseWrapper response) throws EXistException, XPathException, PermissionDeniedException, IOException { try (final DBBroker broker = getPool().getBroker()) { @@ -304,7 +304,7 @@ private Sequence executeQuery(final Source source, final RequestWrapper request, // special header to indicate that the query is not returned from cache response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); - return queryResult.result; + return queryResult; } } diff --git a/exist-core/src/main/java/org/exist/http/servlets/XQueryServlet.java b/exist-core/src/main/java/org/exist/http/servlets/XQueryServlet.java index 33d4706563..4156430649 100644 --- a/exist-core/src/main/java/org/exist/http/servlets/XQueryServlet.java +++ b/exist-core/src/main/java/org/exist/http/servlets/XQueryServlet.java @@ -509,47 +509,48 @@ protected void process(HttpServletRequest request, HttpServletResponse response) final Properties outputProperties = new Properties(); outputProperties.put("base-uri", collectionURI.toString()); - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, outputProperties, null, setupXqueryContextPreExecution, setupXqueryContextPostExecution); - - // special header to indicate that the query is not returned from cache - response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); - - final String mediaType = outputProperties.getProperty(OutputKeys.MEDIA_TYPE); - if (mediaType != null) { - if (!response.isCommitted()) { - if (isTextContent(mediaType)) { - response.setContentType(mediaType + "; charset=" + getFormEncoding()); - response.setCharacterEncoding(getFormEncoding()); - } else { - response.setContentType(mediaType); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, outputProperties, null, setupXqueryContextPreExecution, setupXqueryContextPostExecution)) { + + // special header to indicate that the query is not returned from cache + response.setHeader(XQUERY_CACHED_RESPONSE_HEADER, queryResult.compilationTime == XQueryUtil.QueryResult.RETRIEVED_CACHED_COMPILED_QUERY ? "true" : "false"); + + final String mediaType = outputProperties.getProperty(OutputKeys.MEDIA_TYPE); + if (mediaType != null) { + if (!response.isCommitted()) { + if (isTextContent(mediaType)) { + response.setContentType(mediaType + "; charset=" + getFormEncoding()); + response.setCharacterEncoding(getFormEncoding()); + } else { + response.setContentType(mediaType); + } } + + } else { + String contentType = this.contentType; + try { + contentType = getServletContext().getMimeType(path); + if (contentType == null) { + contentType = this.contentType; + } + + } catch (final Throwable e) { + contentType = this.contentType; + + } finally { + if (isTextContent(contentType)) { + contentType += "; charset=" + getFormEncoding(); + } + response.setContentType(contentType); + } + } + + if (requestXqueryAttr != null && (XmldbURI.API_LOCAL.equals(collectionURI.getApiName())) ) { + request.setAttribute(requestXqueryAttr, queryResult.result); + + } else { + final XQuerySerializer serializer = new XQuerySerializer(broker, outputProperties, output); + serializer.serialize(queryResult.result); } - - } else { - String contentType = this.contentType; - try { - contentType = getServletContext().getMimeType(path); - if (contentType == null) { - contentType = this.contentType; - } - - } catch (final Throwable e) { - contentType = this.contentType; - - } finally { - if (isTextContent(contentType)) { - contentType += "; charset=" + getFormEncoding(); - } - response.setContentType(contentType); - } - } - - if (requestXqueryAttr != null && (XmldbURI.API_LOCAL.equals(collectionURI.getApiName())) ) { - request.setAttribute(requestXqueryAttr, queryResult.result); - - } else { - final XQuerySerializer serializer = new XQuerySerializer(broker, outputProperties, output); - serializer.serialize(queryResult.result); } } catch (final PermissionDeniedException e) { diff --git a/exist-core/src/main/java/org/exist/http/urlrewrite/XQueryURLRewrite.java b/exist-core/src/main/java/org/exist/http/urlrewrite/XQueryURLRewrite.java index 9027ba16b8..f496bee787 100644 --- a/exist-core/src/main/java/org/exist/http/urlrewrite/XQueryURLRewrite.java +++ b/exist-core/src/main/java/org/exist/http/urlrewrite/XQueryURLRewrite.java @@ -262,93 +262,100 @@ protected void service(final HttpServletRequest request, final HttpServletRespon outputProperties.setProperty(OutputKeys.ENCODING, UTF_8.name()); outputProperties.setProperty(OutputKeys.MEDIA_TYPE, MediaType.APPLICATION_XML); - final Sequence result = runQuery(broker, modifiedRequest, response, modelView, staticRewrite, outputProperties); + try (@Nullable final XQueryUtil.QueryResult queryResult = runQuery(broker, modifiedRequest, response, modelView, staticRewrite, outputProperties)) { - logResult(broker, result); - - if (response.isCommitted()) { - return; - } - - // process the query result - if (result.getItemCount() == 1) { - final Item resource = result.itemAt(0); - if (!Type.subTypeOf(resource.getType(), Type.NODE)) { - throw new ServletException("XQueryURLRewrite: urlrewrite query should return an element!"); - } - Node node = ((NodeValue) resource).getNode(); - if (node.getNodeType() == Node.DOCUMENT_NODE) { - node = ((Document) node).getDocumentElement(); + if (queryResult != null) { + logResult(broker, queryResult); } - if (node.getNodeType() != Node.ELEMENT_NODE) { - //throw new ServletException("Redirect XQuery should return an XML element!"); - response(broker, response, outputProperties, result); - return; - } - Element elem = (Element) node; - final String ns = elem.getNamespaceURI(); - if (!Namespaces.EXIST_NS.equals(ns)) { - response(broker, response, outputProperties, result); + + if (response.isCommitted()) { return; } - final String nsUri = elem.getNamespaceURI(); - if (Namespaces.EXIST_NS.equals(nsUri) && "dispatch".equals(elem.getLocalName())) { - node = elem.getFirstChild(); - while (node != null) { - final String nodeNs = node.getNamespaceURI(); - if (node.getNodeType() == Node.ELEMENT_NODE && Namespaces.EXIST_NS.equals(nodeNs)) { - final Element action = (Element) node; - if ("view".equals(action.getLocalName())) { - parseViews(modifiedRequest, action, modelView); - } else if ("error-handler".equals(action.getLocalName())) { - parseErrorHandlers(modifiedRequest, action, modelView); - } else if ("cache-control".equals(action.getLocalName())) { - final String option = action.getAttribute("cache"); - modelView.setUseCache("yes".equals(option)); - } else { - final URLRewrite urw = parseAction(modifiedRequest, action); - if (urw != null) { - modelView.setModel(urw); + // process the query result + if (queryResult != null) { + if (queryResult.result.getItemCount() == 1) { + final Item resource = queryResult.result.itemAt(0); + if (!Type.subTypeOf(resource.getType(), Type.NODE)) { + throw new ServletException("XQueryURLRewrite: urlrewrite query should return an element!"); + } + Node node = ((NodeValue) resource).getNode(); + if (node.getNodeType() == Node.DOCUMENT_NODE) { + node = ((Document) node).getDocumentElement(); + } + if (node.getNodeType() != Node.ELEMENT_NODE) { + //throw new ServletException("Redirect XQuery should return an XML element!"); + response(broker, response, outputProperties, queryResult.result); + return; + } + Element elem = (Element) node; + final String ns = elem.getNamespaceURI(); + if (!Namespaces.EXIST_NS.equals(ns)) { + response(broker, response, outputProperties, queryResult.result); + return; + } + + final String nsUri = elem.getNamespaceURI(); + if (Namespaces.EXIST_NS.equals(nsUri) && "dispatch".equals(elem.getLocalName())) { + node = elem.getFirstChild(); + while (node != null) { + final String nodeNs = node.getNamespaceURI(); + if (node.getNodeType() == Node.ELEMENT_NODE && Namespaces.EXIST_NS.equals(nodeNs)) { + final Element action = (Element) node; + if ("view".equals(action.getLocalName())) { + parseViews(modifiedRequest, action, modelView); + } else if ("error-handler".equals(action.getLocalName())) { + parseErrorHandlers(modifiedRequest, action, modelView); + } else if ("cache-control".equals(action.getLocalName())) { + final String option = action.getAttribute("cache"); + modelView.setUseCache("yes".equals(option)); + } else { + final URLRewrite urw = parseAction(modifiedRequest, action); + if (urw != null) { + modelView.setModel(urw); + } + } } + node = node.getNextSibling(); + } + if (modelView.getModel() == null) { + modelView.setModel(new PassThrough(config, elem, modifiedRequest)); } + } else if (nsUri != null && Namespaces.EXIST_NS.equals(elem.getNamespaceURI()) && "ignore".equals(elem.getLocalName())) { + modelView.setModel(new PassThrough(config, elem, modifiedRequest)); + final NodeList nl = elem.getElementsByTagNameNS(Namespaces.EXIST_NS, "cache-control"); + if (nl.getLength() > 0) { + elem = (Element) nl.item(0); + final String option = elem.getAttribute("cache"); + modelView.setUseCache("yes".equals(option)); + } + } else { + response(broker, response, outputProperties, queryResult.result); + return; } - node = node.getNextSibling(); - } - if (modelView.getModel() == null) { - modelView.setModel(new PassThrough(config, elem, modifiedRequest)); - } - } else if (nsUri != null && Namespaces.EXIST_NS.equals(elem.getNamespaceURI()) && "ignore".equals(elem.getLocalName())) { - modelView.setModel(new PassThrough(config, elem, modifiedRequest)); - final NodeList nl = elem.getElementsByTagNameNS(Namespaces.EXIST_NS, "cache-control"); - if (nl.getLength() > 0) { - elem = (Element) nl.item(0); - final String option = elem.getAttribute("cache"); - modelView.setUseCache("yes".equals(option)); + } else if (queryResult.result.getItemCount() > 1) { + response(broker, response, outputProperties, queryResult.result); + return; } - } else { - response(broker, response, outputProperties, result); - return; } - } else if (result.getItemCount() > 1) { - response(broker, response, outputProperties, result); - return; - } - if (modelView.useCache()) { - LOG.debug("Caching request to {}", request.getRequestURI()); - urlCache.put(modifiedRequest.getHeader("Host") + request.getRequestURI(), modelView); + if (modelView.useCache()) { + LOG.debug("Caching request to {}", request.getRequestURI()); + urlCache.put(modifiedRequest.getHeader("Host") + request.getRequestURI(), modelView); + } } - } - // store the original request URI to org.exist.forward.request-uri - modifiedRequest.setAttribute(RQ_ATTR_REQUEST_URI, request.getRequestURI()); - modifiedRequest.setAttribute(RQ_ATTR_SERVLET_PATH, request.getServletPath()); + // store the original request URI to org.exist.forward.request-uri + modifiedRequest.setAttribute(RQ_ATTR_REQUEST_URI, request.getRequestURI()); + modifiedRequest.setAttribute(RQ_ATTR_SERVLET_PATH, request.getServletPath()); + } } + if (LOG.isTraceEnabled()) { LOG.trace("URLRewrite took {}ms.", System.currentTimeMillis() - start); } + final HttpServletResponse wrappedResponse = new CachingResponseWrapper(response, modelView.hasViews() || modelView.hasErrorHandlers()); if (modelView.getModel() == null) { @@ -634,11 +641,11 @@ private void configure() throws ServletException { authenticator = new BasicAuthenticator(pool); } - private void logResult(final DBBroker broker, final Sequence result) throws SAXException { - if (LOG.isTraceEnabled() && result.getItemCount() > 0) { + private void logResult(final DBBroker broker, final XQueryUtil.QueryResult queryResult) throws SAXException { + if (LOG.isTraceEnabled() && queryResult.result.getItemCount() > 0) { final Serializer serializer = broker.borrowSerializer(); try { - final Item item = result.itemAt(0); + final Item item = queryResult.result.itemAt(0); if (Type.subTypeOf(item.getType(), Type.NODE)) { LOG.trace(serializer.serialize((NodeValue) item)); } @@ -663,12 +670,13 @@ private SourceInfo getSourceInfo(final DBBroker broker, final RequestWrapper req } } - private Sequence runQuery(final DBBroker broker, final RequestWrapper request, final HttpServletResponse response, final ModelAndView model, final URLRewrite staticRewrite, final Properties outputProperties) throws ServletException, XPathException, PermissionDeniedException { + private @Nullable XQueryUtil.QueryResult runQuery(final DBBroker broker, final RequestWrapper request, final HttpServletResponse response, final ModelAndView model, final URLRewrite staticRewrite, final Properties outputProperties) throws ServletException, XPathException, PermissionDeniedException { // Try to find the XQuery final SourceInfo sourceInfo = getSourceInfo(broker, request, staticRewrite); if (sourceInfo == null) { - return Sequence.EMPTY_SEQUENCE; // no controller found + return null; } + model.setSourceInfo(sourceInfo); final String basePath = staticRewrite == null ? "." : staticRewrite.getTarget(); @@ -683,8 +691,7 @@ private Sequence runQuery(final DBBroker broker, final RequestWrapper request, f }; try { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, sourceInfo.source, compiledCache, null, outputProperties, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); - return queryResult.result; + return XQueryUtil.query(broker, sourceInfo.source, compiledCache, null, outputProperties, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); } catch (final IOException e) { throw new XPathException("Unable to compile query source: " + e.getMessage(), e); } diff --git a/exist-core/src/main/java/org/exist/launcher/Launcher.java b/exist-core/src/main/java/org/exist/launcher/Launcher.java index d486d19429..6587c8d414 100644 --- a/exist-core/src/main/java/org/exist/launcher/Launcher.java +++ b/exist-core/src/main/java/org/exist/launcher/Launcher.java @@ -707,15 +707,17 @@ private void checkInstalledApps() { try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { final String query = "repo:list()"; - final Sequence pkgs = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - for (final SequenceIterator i = pkgs.iterate(); i.hasNext(); ) { - final ExistRepository.Notification notification = new ExistRepository.Notification(ExistRepository.Action.INSTALL, i.nextItem().getStringValue()); - final Optional expathRepo = pool.getExpathRepo(); - if (expathRepo.isPresent()) { - update(expathRepo.get(), notification); - utilityPanel.update(expathRepo.get(), notification); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence pkgs = queryResult.result; + for (final SequenceIterator i = pkgs.iterate(); i.hasNext(); ) { + final ExistRepository.Notification notification = new ExistRepository.Notification(ExistRepository.Action.INSTALL, i.nextItem().getStringValue()); + final Optional expathRepo = pool.getExpathRepo(); + if (expathRepo.isPresent()) { + update(expathRepo.get(), notification); + utilityPanel.update(expathRepo.get(), notification); + } + expathRepo.orElseThrow(() -> new EXistException("EXPath repository is not available.")); } - expathRepo.orElseThrow(() -> new EXistException("EXPath repository is not available.")); } } } catch (final EXistException | IOException | XPathException | PermissionDeniedException e) { diff --git a/exist-core/src/main/java/org/exist/management/impl/SanityReport.java b/exist-core/src/main/java/org/exist/management/impl/SanityReport.java index 78a204b2c2..1933dece84 100644 --- a/exist-core/src/main/java/org/exist/management/impl/SanityReport.java +++ b/exist-core/src/main/java/org/exist/management/impl/SanityReport.java @@ -204,7 +204,9 @@ public long ping(boolean checkQueryEngine) { try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getGuestSubject()))) { if (checkQueryEngine) { - XQueryUtil.query(broker, TEST_XQUERY, true, null, null, null, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, TEST_XQUERY, true, null, null, null, null, null)) { + // Query result is not used but must be closed + } } } catch (final Exception e) { lastPingRespTime = -2; diff --git a/exist-core/src/main/java/org/exist/repo/Deployment.java b/exist-core/src/main/java/org/exist/repo/Deployment.java index a3ce3d51e6..32184b673c 100644 --- a/exist-core/src/main/java/org/exist/repo/Deployment.java +++ b/exist-core/src/main/java/org/exist/repo/Deployment.java @@ -362,7 +362,9 @@ public Optional undeploy(final DBBroker broker, final Txn transaction, f try { final Optional cleanup = findElement(repoXML, CLEANUP_ELEMENT); if(cleanup.isPresent()) { - runQuery(broker, null, packageDir, cleanup.get().getStringValue(), pkgName, QueryPurpose.UNDEPLOY); + try (@Nullable final XQueryUtil.QueryResult queryResult = runQuery(broker, null, packageDir, cleanup.get().getStringValue(), pkgName, QueryPurpose.UNDEPLOY)) { + // Query result is not used but must be closed + } } final Optional target = findElement(repoXML, TARGET_COLL_ELEMENT); @@ -401,8 +403,11 @@ public Optional deploy(final DBBroker broker, final Txn transaction, fin final Optional setupPath = setup.map(ElementImpl::getStringValue).filter(s -> !s.isEmpty()); if (setupPath.isPresent()) { - runQuery(broker, null, packageDir, setupPath.get(), pkgName, QueryPurpose.SETUP); - return Optional.empty(); + try (@Nullable final XQueryUtil.QueryResult queryResult = runQuery(broker, null, packageDir, setupPath.get(), pkgName, QueryPurpose.SETUP)) { + // Query result is not used but must be closed + + return Optional.empty(); + } } else { // otherwise create the target collection XmldbURI targetCollection = null; @@ -470,7 +475,9 @@ public Optional deploy(final DBBroker broker, final Txn transaction, fin final Optional preSetupPath = preSetup.map(ElementImpl::getStringValue).filter(s -> !s.isEmpty()); if(preSetupPath.isPresent()) { - runQuery(broker, targetCollection, packageDir, preSetupPath.get(), pkgName, QueryPurpose.PREINSTALL); + try (@Nullable final XQueryUtil.QueryResult queryResult = runQuery(broker, targetCollection, packageDir, preSetupPath.get(), pkgName, QueryPurpose.PREINSTALL)) { + // Query result is not used but must be closed + } } // create the group specified in the permissions element if needed @@ -496,7 +503,9 @@ public Optional deploy(final DBBroker broker, final Txn transaction, fin final Optional postSetupPath = postSetup.map(ElementImpl::getStringValue).filter(s -> !s.isEmpty()); if(postSetupPath.isPresent()) { - runQuery(broker, targetCollection, packageDir, postSetupPath.get(), pkgName, QueryPurpose.POSTINSTALL); + try (@Nullable final XQueryUtil.QueryResult queryResult = runQuery(broker, targetCollection, packageDir, postSetupPath.get(), pkgName, QueryPurpose.POSTINSTALL)) { + // Query result is not used but must be closed + } } // TODO: it should be safe to clean up the file system after a package @@ -713,13 +722,13 @@ public String getPurposeString() { } } - private Sequence runQuery(final DBBroker broker, final XmldbURI targetCollection, final Path tempDir, + private @Nullable XQueryUtil.QueryResult runQuery(final DBBroker broker, final XmldbURI targetCollection, final Path tempDir, final String fileName, final String pkgName, final QueryPurpose purpose) throws PackageException, IOException, XPathException { final Path xqueryPath = tempDir.resolve(fileName); if (!Files.isReadable(xqueryPath)) { LOG.warn("The XQuery resource specified in the {} was not found for EXPath Package: '{}'", purpose.getPurposeString(), pkgName); - return Sequence.EMPTY_SEQUENCE; + return null; } final Source source = new FileSource(xqueryPath, false); @@ -752,8 +761,7 @@ private Sequence runQuery(final DBBroker broker, final XmldbURI targetCollection }; try { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); - return queryResult.result; + return XQueryUtil.query(broker, source, false, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); } catch (final PermissionDeniedException e) { throw new PackageException(e.getMessage(), e); } diff --git a/exist-core/src/main/java/org/exist/scheduler/UserXQueryJob.java b/exist-core/src/main/java/org/exist/scheduler/UserXQueryJob.java index 79ba3f30a8..1a6b26b444 100644 --- a/exist-core/src/main/java/org/exist/scheduler/UserXQueryJob.java +++ b/exist-core/src/main/java/org/exist/scheduler/UserXQueryJob.java @@ -232,8 +232,8 @@ private void executeXQuery(final BrokerPool pool, final DBBroker broker, final S } }; - try { - XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null)) { + // Query result is not used but must be closed } catch (final IOException e) { abort("Failed to read query from " + xqueryResource); } diff --git a/exist-core/src/main/java/org/exist/storage/serializers/XIncludeFilter.java b/exist-core/src/main/java/org/exist/storage/serializers/XIncludeFilter.java index c42e39c802..5cba3cf150 100644 --- a/exist-core/src/main/java/org/exist/storage/serializers/XIncludeFilter.java +++ b/exist-core/src/main/java/org/exist/storage/serializers/XIncludeFilter.java @@ -487,25 +487,26 @@ protected Optional processXInclude(final String href, String xpoi contextSeq = memtreeDoc; } - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(serializer.broker, source, xpointer != null, true, contextSeq, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(serializer.broker, source, xpointer != null, true, contextSeq, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null)) { - final Sequence seq = queryResult.result; + final Sequence seq = queryResult.result; - if (Type.subTypeOf(seq.getItemType(), Type.NODE)) { - if (LOG.isDebugEnabled()) { - LOG.debug("XPointer found: {}", seq.getItemCount()); - } + if (Type.subTypeOf(seq.getItemType(), Type.NODE)) { + if (LOG.isDebugEnabled()) { + LOG.debug("XPointer found: {}", seq.getItemCount()); + } - NodeValue node; - for (final SequenceIterator i = seq.iterate(); i.hasNext(); ) { - node = (NodeValue) i.nextItem(); - serializer.serializeToReceiver(node, false); - } - } else { - String val; - for (int i = 0; i < seq.getItemCount(); i++) { - val = seq.itemAt(i).getStringValue(); - characters(val); + NodeValue node; + for (final SequenceIterator i = seq.iterate(); i.hasNext(); ) { + node = (NodeValue) i.nextItem(); + serializer.serializeToReceiver(node, false); + } + } else { + String val; + for (int i = 0; i < seq.getItemCount(); i++) { + val = seq.itemAt(i).getStringValue(); + characters(val); + } } } diff --git a/exist-core/src/main/java/org/exist/test/TransactionTestDSL.java b/exist-core/src/main/java/org/exist/test/TransactionTestDSL.java index 46d16510b2..ca6d23ed1a 100644 --- a/exist-core/src/main/java/org/exist/test/TransactionTestDSL.java +++ b/exist-core/src/main/java/org/exist/test/TransactionTestDSL.java @@ -650,7 +650,9 @@ static TransactionOperation updateDocument(fin final NodeSet nodeSet = new NewArrayNodeSet(); nodeSet.add(new NodeProxy(null, doc)); - XQueryUtil.query(broker, new StringSource(xqueryUpdate), false, nodeSet, null, null, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(xqueryUpdate), false, nodeSet, null, null, null, null)) { + // Query result is not used but must be closed + } return null; }; } @@ -671,7 +673,9 @@ static TransactionOperation queryDocument(fina final NodeSet nodeSet = new NewArrayNodeSet(); nodeSet.add(new NodeProxy(null, doc)); - XQueryUtil.query(broker, new StringSource(query), false, nodeSet, null, null, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, nodeSet, null, null, null, null)) { + // Query result is not used but must be closed + } return null; }; } diff --git a/exist-core/src/main/java/org/exist/test/XQueryAssertions.java b/exist-core/src/main/java/org/exist/test/XQueryAssertions.java index fbf2b8ae77..8a05915ca4 100644 --- a/exist-core/src/main/java/org/exist/test/XQueryAssertions.java +++ b/exist-core/src/main/java/org/exist/test/XQueryAssertions.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,9 +46,7 @@ package org.exist.test; import com.evolvedbinary.j8fu.Either; -import org.exist.xquery.CompiledXQuery; -import org.exist.xquery.ErrorCodes; -import org.exist.xquery.XPathException; +import org.exist.xquery.*; import org.exist.xquery.value.Sequence; import org.hamcrest.Matcher; import javax.xml.transform.Source; @@ -57,12 +79,12 @@ public static void assertXQStaticError(final ErrorCodes.ErrorCode expectedCode, assertXQErrorColumn(column, xpe); } - public static void assertXQDynamicError(final ErrorCodes.ErrorCode expectedCode, final int line, final int column, final String expectedMessage, final Either actual) { + public static void assertXQDynamicError(final ErrorCodes.ErrorCode expectedCode, final int line, final int column, final String expectedMessage, final Either actual) { assertXQDynamicError(expectedCode, line, column, actual); assertXQErrorMessage(expectedMessage, actual.left().get()); } - public static void assertXQDynamicError(final ErrorCodes.ErrorCode expectedCode, final int line, final int column, final Either actual) { + public static void assertXQDynamicError(final ErrorCodes.ErrorCode expectedCode, final int line, final int column, final Either actual) { assertTrue("Expected dynamic error: " + expectedCode.getErrorQName() + ", but no error was thrown.", actual.isLeft()); final XPathException xpe = actual.left().get(); assertXQErrorLine(line, xpe); @@ -70,19 +92,19 @@ public static void assertXQDynamicError(final ErrorCodes.ErrorCode expectedCode, assertXQErrorCode(expectedCode, xpe); } - public static void assertThatXQResult(final Either actual, final Matcher expectedMatcher) { + public static void assertThatXQResult(final Either actual, final Matcher expectedMatcher) { if (actual.isLeft()) { fail("Expected result, but found XPathException: " + actual.left().get().toString()); } - final Sequence sequence = actual.right().get(); + final Sequence sequence = actual.right().get().result; assertThat(sequence, expectedMatcher); } - public static void assertXQResultSimilar(final Source expectedSource, final Either actual) { + public static void assertXQResultSimilar(final Source expectedSource, final Either actual) { assertThatXQResult(actual, hasSimilarXml(expectedSource)); } - public static void assertXQResultIdentical(final Source expectedSource, final Either actual) { + public static void assertXQResultIdentical(final Source expectedSource, final Either actual) { assertThatXQResult(actual, hasIdenticalXml(expectedSource)); } diff --git a/exist-core/src/main/java/org/exist/test/XQueryCompilationTest.java b/exist-core/src/main/java/org/exist/test/XQueryCompilationTest.java index e7cd925188..068c4ce0d1 100644 --- a/exist-core/src/main/java/org/exist/test/XQueryCompilationTest.java +++ b/exist-core/src/main/java/org/exist/test/XQueryCompilationTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -60,11 +84,12 @@ protected static Either compileQuery(final Strin } } - protected static Either executeQuery(final String string) throws EXistException, PermissionDeniedException { + protected static Either executeQuery(final String string) throws EXistException, PermissionDeniedException { final BrokerPool pool = server.getBrokerPool(); try (final DBBroker broker = pool.getBroker()) { try { - return Right(XQueryUtil.query(broker, new StringSource(string), false, null, null, null, null, null).result); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(string), false, null, null, null, null, null); + return Right(queryResult); } catch (final XPathException e) { return Left(e); } catch (final IOException e) { @@ -73,4 +98,10 @@ protected static Either executeQuery(final String stri } } + protected static void close(final Either queryResult) { + if (queryResult.isRight()) { + queryResult.right().get().close(); + } + } + } diff --git a/exist-core/src/main/java/org/exist/test/runner/AbstractTestRunner.java b/exist-core/src/main/java/org/exist/test/runner/AbstractTestRunner.java index 98a39f863e..5ce710112c 100644 --- a/exist-core/src/main/java/org/exist/test/runner/AbstractTestRunner.java +++ b/exist-core/src/main/java/org/exist/test/runner/AbstractTestRunner.java @@ -59,7 +59,6 @@ import org.exist.xquery.XQueryContext; import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.AnyURIValue; -import org.exist.xquery.value.Sequence; import org.junit.runner.Runner; import java.io.IOException; @@ -87,7 +86,7 @@ protected AbstractTestRunner(final Path path, final boolean parallel) { this.parallel = parallel; } - protected static Sequence executeQuery(final BrokerPool brokerPool, final Source source, final List>> externalVariableBindings) throws EXistException, PermissionDeniedException, XPathException, IOException, DatabaseConfigurationException { + protected static void executeQuery(final BrokerPool brokerPool, final Source source, final List>> externalVariableBindings) throws EXistException, PermissionDeniedException, XPathException, IOException, DatabaseConfigurationException { final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { // Setup paths in the context @@ -112,8 +111,10 @@ protected static Sequence executeQuery(final BrokerPool brokerPool, final Source final SecurityManager securityManager = requireNonNull(brokerPool.getSecurityManager(), "securityManager is null"); - try (final DBBroker broker = brokerPool.get(Optional.of(securityManager.getSystemSubject()))) { - return XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null).result; + try (final DBBroker broker = brokerPool.get(Optional.of(securityManager.getSystemSubject())); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null)) { + + // Query result is not used but must be closed } } diff --git a/exist-core/src/main/java/org/exist/validation/internal/DatabaseResources.java b/exist-core/src/main/java/org/exist/validation/internal/DatabaseResources.java index 814732b067..a0f6562e87 100644 --- a/exist-core/src/main/java/org/exist/validation/internal/DatabaseResources.java +++ b/exist-core/src/main/java/org/exist/validation/internal/DatabaseResources.java @@ -124,29 +124,31 @@ public List getAllResults(Sequence sequence){ * @param sequence Result of query. * @return String containing representation of 1st entry of sequence. */ - public String getFirstResult(Sequence sequence){ + public String getFirstResult(final Sequence sequence) { String result = null; - - try { - final SequenceIterator i = sequence.iterate(); - if(i.hasNext()){ - result= i.nextItem().getStringValue(); - - LOGGER.debug("Single query result: '{}'.", result); - - } else { - LOGGER.debug("No query result."); + + if (sequence != null) { + try { + final SequenceIterator i = sequence.iterate(); + if (i.hasNext()) { + result = i.nextItem().getStringValue(); + + LOGGER.debug("Single query result: '{}'.", result); + + } else { + LOGGER.debug("No query result."); + } + + } catch (final XPathException ex) { + LOGGER.error("XQuery issue ", ex); } - - } catch (final XPathException ex) { - LOGGER.error("XQuery issue ", ex); } return result; } - public @Nullable Sequence executeQuery(final String queryPath, final Map params, final Subject user){ + public @Nullable XQueryUtil.QueryResult executeQuery(final String queryPath, final Map params, final Subject user){ @Nullable final String namespace = params.get(TARGETNAMESPACE); @Nullable final String publicId = params.get(PUBLICID); @Nullable final String catalogPath = params.get(CATALOG); @@ -177,9 +179,8 @@ public String getFirstResult(Sequence sequence){ }; final Source source = new ClassLoaderSource(queryPath); - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, null, null); - return queryResult.result; - + return XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, null, null); + } catch (final EXistException | XPathException | IOException | PermissionDeniedException ex) { LOGGER.error("Problem executing XQuery: {}", ex.getMessage(), ex); return null; @@ -211,9 +212,9 @@ public String findXSD(String collection, String targetNamespace, Subject user){ params.put(COLLECTION, collection); params.put(TARGETNAMESPACE, targetNamespace); - final Sequence result = executeQuery(FIND_XSD, params, user ); - - return getFirstResult(result); + try (final XQueryUtil.QueryResult queryResult = executeQuery(FIND_XSD, params, user)) { + return getFirstResult(queryResult.result); + } } public String findCatalogWithDTD(String collection, String publicId, Subject user){ @@ -225,10 +226,10 @@ public String findCatalogWithDTD(String collection, String publicId, Subject use final Map params = new HashMap<>(); params.put(COLLECTION, collection); params.put(PUBLICID, publicId); - - final Sequence result = executeQuery(FIND_CATALOGS_WITH_DTD, params, user ); - - return getFirstResult(result); + + try (final XQueryUtil.QueryResult queryResult = executeQuery(FIND_CATALOGS_WITH_DTD, params, user)) { + return getFirstResult(queryResult.result); + } } } diff --git a/exist-core/src/main/java/org/exist/xmldb/LocalResourceSet.java b/exist-core/src/main/java/org/exist/xmldb/LocalResourceSet.java index 9094974652..63b955c853 100644 --- a/exist-core/src/main/java/org/exist/xmldb/LocalResourceSet.java +++ b/exist-core/src/main/java/org/exist/xmldb/LocalResourceSet.java @@ -60,6 +60,7 @@ import org.exist.util.serializer.SAXSerializer; import org.exist.util.serializer.SerializerPool; import org.exist.xquery.XPathException; +import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.*; import org.w3c.dom.Node; import org.xml.sax.SAXException; @@ -76,12 +77,15 @@ public class LocalResourceSet extends AbstractLocal implements ResourceSet { private final List resources = new ArrayList<>(); private final Properties outputProperties; + private final Runnable queryResultCloser; - public LocalResourceSet(final Subject user, final BrokerPool pool, final LocalCollection col, final Properties properties, final Sequence val, final String sortExpr) throws XMLDBException { + public LocalResourceSet(final Subject user, final BrokerPool pool, final LocalCollection col, final Properties properties, final XQueryUtil.QueryResult queryResult, final String sortExpr) throws XMLDBException { super(user, pool, col); this.outputProperties = properties; + this.queryResultCloser = queryResult::close; - if(val.isEmpty()) { + final Sequence val = queryResult.result; + if (val.isEmpty()) { return; } @@ -122,16 +126,8 @@ public void addAll(final ResourceSet resourceSet) throws XMLDBException { @Override public void clear() throws XMLDBException { - //cleanup any binary values - resources.stream().filter((resource) -> (resource instanceof BinaryValue)).forEach((resource) -> { - try { - ((BinaryValue) resource).close(); - } catch(final IOException ioe) { - LOG.warn("Unable to cleanup BinaryValue: {}", resource.hashCode(), ioe); - } - }); - resources.clear(); + queryResultCloser.run(); } @Override diff --git a/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java b/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java index 63313ada06..8dfab7434b 100644 --- a/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java +++ b/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java @@ -90,6 +90,8 @@ import org.exist.security.Permission; import com.evolvedbinary.j8fu.Either; +import javax.annotation.Nullable; + public class LocalXPathQueryService extends AbstractLocalService implements EXistXPathQueryService, EXistXQueryService { private final static Logger LOG = LogManager.getLogger(LocalXPathQueryService.class); @@ -215,10 +217,11 @@ public ResourceSet execute(final XMLResource res, final CompiledExpression expre } private ResourceSet execute(final DBBroker broker, final Txn transaction, XmldbURI[] docs, final Sequence contextSet, final CompiledExpression expression, final String sortExpr) throws XMLDBException { - final long start = System.currentTimeMillis(); - final CompiledXQuery expr = (CompiledXQuery)expression; - Sequence result = null; + final CompiledXQuery expr = (CompiledXQuery) expression; final XQueryContext context = expr.getContext(); + + boolean queryResultOwnershipTransferred = false; + @Nullable XQueryUtil.QueryResult queryResult = null; try { context.setStaticallyKnownDocuments(docs); if (lockedDocuments != null) { @@ -228,42 +231,42 @@ private ResourceSet execute(final DBBroker broker, final Txn transaction, XmldbU declareVariables(context); final XQuery xquery = brokerPool.getXQueryService(); - result = xquery.execute(broker, expr, null, contextSet, properties, true); + + final long executionStarted = System.currentTimeMillis(); + @Nullable final Sequence result = xquery.execute(broker, expr, null, contextSet, properties, true); + final long executionFinished = System.currentTimeMillis(); + if (LOG.isTraceEnabled()) { - LOG.trace("Query took {} ms.", System.currentTimeMillis() - start); + LOG.trace("Query took {} ms.", executionFinished - executionStarted); + } + + if (result == null) { + return null; } + queryResult = new XQueryUtil.QueryResult(expr.getSource(), null, expr, context, -1, executionFinished - executionStarted, result); + + final Properties resourceSetProperties = new Properties(properties); + resourceSetProperties.setProperty(EXistOutputKeys.XDM_SERIALIZATION, "yes"); + + // NOTE(AR) LocalResourceSet takes ownership of QueryResult sequence! So it is responsible to call `QueryResult#close()` when it is finished with it + final ResourceSet resourceSet = new LocalResourceSet(user, brokerPool, collection, resourceSetProperties, queryResult, sortExpr); + queryResultOwnershipTransferred = true; + return resourceSet; + } catch (final Exception e) { // need to catch all runtime exceptions here to be able to release locked documents throw new XMLDBException(ErrorCodes.VENDOR_ERROR, e.getMessage(), e); + } finally { - /* - * Run the cleanup tasks, but don't close BinaryValues which - * are in the result set as the user has not yet accessed them. - * - * Final cleanup of those BinaryValues is done by the user - * calling EXistResource#close(), ResourceSet#clear() or CompiledExpression#reset(). - */ - final Sequence resSeq = result; - context.runCleanupTasks(o -> { - if(resSeq != null && o instanceof BinaryValue) { - for(int i = 0; i < resSeq.getItemCount(); i++) { - if (resSeq.itemAt(i) == o) { - return false; - } - } + if (!queryResultOwnershipTransferred) { + // NOTE(AR) we are returning null or an exception was raised, and so we still own the queryResult and we must therefore close it + if (queryResult != null) { + queryResult.close(); + } else { + context.runCleanupTasks(); } - - return true; - }); - } - - if(result != null) { - final Properties resourceSetProperties = new Properties(properties); - resourceSetProperties.setProperty(EXistOutputKeys.XDM_SERIALIZATION, "yes"); - return new LocalResourceSet(user, brokerPool, collection, resourceSetProperties, result, sortExpr); - } else { - return null; + } } } @@ -300,22 +303,39 @@ private ResourceSet execute(final LocalXmldbFunction sourceOp) throws XM final ConsumerE setupXqueryContextPreExecution = this::declareVariables; - final XQueryUtil.QueryResult queryResult; + boolean queryResultOwnershipTransferred = false; + @Nullable XQueryUtil.QueryResult queryResult = null; try { queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); + if (LOG.isTraceEnabled()) { LOG.trace("Query took {} ms.", queryResult.executionTime); } + + if (queryResult.result == null) { + return null; + } + + final Properties resourceSetProperties = new Properties(properties); + resourceSetProperties.setProperty(EXistOutputKeys.XDM_SERIALIZATION, "yes"); + + // NOTE(AR) LocalResourceSet takes ownership of QueryResult sequence! So it is responsible to call `QueryResult#close()` when it is finished with it + final ResourceSet resourceSet = new LocalResourceSet(user, brokerPool, collection, resourceSetProperties, queryResult, null); + queryResultOwnershipTransferred = true; + return resourceSet; + } catch (final XPathException e) { if (e.getCause() instanceof XMLDBException) { throw (XMLDBException) e.getCause(); } throw e; - } - final Properties resourceSetProperties = new Properties(properties); - resourceSetProperties.setProperty(EXistOutputKeys.XDM_SERIALIZATION, "yes"); - return queryResult.result != null ? new LocalResourceSet(user, brokerPool, collection, resourceSetProperties, queryResult.result, null) : null; + } finally { + if (queryResult != null && !queryResultOwnershipTransferred) { + // NOTE(AR) we are returning null or an exception was raised, and so we still own the queryResult and we must therefore close it + queryResult.close(); + } + } }); } diff --git a/exist-core/src/main/java/org/exist/xquery/XQueryUtil.java b/exist-core/src/main/java/org/exist/xquery/XQueryUtil.java index 27ca775f14..94c14cbcde 100644 --- a/exist-core/src/main/java/org/exist/xquery/XQueryUtil.java +++ b/exist-core/src/main/java/org/exist/xquery/XQueryUtil.java @@ -81,19 +81,18 @@ public static XQueryUtil.QueryResult query(final DBBroker broker, final Source s final BrokerPool brokerPool = broker.getBrokerPool(); final XQuery xquery = brokerPool.getXQueryService(); - @Nullable XQueryPool xqueryPool = null; + @Nullable final XQueryPool xqueryPool; @Nullable CompiledXQuery compiledXquery = null; + if (cacheQuery) { + xqueryPool = brokerPool.getXQueryPool(); + compiledXquery = xqueryPool.borrowCompiledXQuery(broker, source); + } else { + xqueryPool = null; + } + @Nullable XQueryContext xqueryContext = null; try { - if (cacheQuery) { - xqueryPool = brokerPool.getXQueryPool(); - compiledXquery = xqueryPool.borrowCompiledXQuery(broker, source); - } else { - xqueryPool = null; - } - final long compilationTime; - if (compiledXquery != null) { xqueryContext = compiledXquery.getContext(); xqueryContext.prepareForReuse(); @@ -127,7 +126,7 @@ public static XQueryUtil.QueryResult query(final DBBroker broker, final Source s final Sequence result = xquery.execute(broker, compiledXquery, null, contextSequence, outputProperties, true); final long executionTime = System.currentTimeMillis() - executionStart; - final QueryResult queryResult = new XQueryUtil.QueryResult(compilationTime, executionTime, result); + final QueryResult queryResult = new XQueryUtil.QueryResult(source, xqueryPool, compiledXquery, xqueryContext, compilationTime, executionTime, result); if (postExecutionContext != null) { postExecutionContext.accept(xqueryContext, queryResult); @@ -135,7 +134,8 @@ public static XQueryUtil.QueryResult query(final DBBroker broker, final Source s return queryResult; - } finally { + } catch (final XPathException | PermissionDeniedException | IOException e) { + // Make sure to clean-up in case of an exception! if (xqueryContext != null) { xqueryContext.runCleanupTasks(); } @@ -143,21 +143,47 @@ public static XQueryUtil.QueryResult query(final DBBroker broker, final Source s if (xqueryPool != null && compiledXquery != null) { xqueryPool.returnCompiledXQuery(source, compiledXquery); } + + throw e; } } - public static class QueryResult { + public static class QueryResult implements AutoCloseable { + /** + * Indicates that the query did not need to be compiled as a cached version was available. + */ public static final int RETRIEVED_CACHED_COMPILED_QUERY = -1; + private final Source source; + private @Nullable final XQueryPool xqueryPool; + private @Nullable final CompiledXQuery compiledXquery; + private final XQueryContext xqueryContext; + public final long compilationTime; public final long executionTime; public final Sequence result; - public QueryResult(final long compilationTime, final long executionTime, final Sequence result) { + public QueryResult(final Source source, @Nullable final XQueryPool xqueryPool, @Nullable final CompiledXQuery compiledXquery, final XQueryContext xqueryContext, final long compilationTime, final long executionTime, final Sequence result) { + this.source = source; + this.xqueryPool = xqueryPool; + this.compiledXquery = compiledXquery; + this.xqueryContext = xqueryContext; + this.compilationTime = compilationTime; this.executionTime = executionTime; this.result = result; } + + @Override + public void close() { + // NOTE(AR) Only when the user has finished with the Query Result i.e. {@link #result}, can we then clean-up any associated resources. + xqueryContext.runCleanupTasks(); + + // Once we have cleaned-up if the query should be cached we return it to the query pool. + if (xqueryPool != null && compiledXquery != null) { + xqueryPool.returnCompiledXQuery(source, compiledXquery); + } + } } /** diff --git a/exist-core/src/main/java/org/exist/xupdate/Conditional.java b/exist-core/src/main/java/org/exist/xupdate/Conditional.java index 16c6b66a7e..2ba72c2ead 100644 --- a/exist-core/src/main/java/org/exist/xupdate/Conditional.java +++ b/exist-core/src/main/java/org/exist/xupdate/Conditional.java @@ -106,30 +106,27 @@ public long process(final Txn transaction) throws PermissionDeniedException, Loc declareVariables(xqueryContext); }; - final XQueryUtil.QueryResult queryResult; - try { - queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + if (seq.effectiveBooleanValue()) { + long mods = 0; + for (final Modification modification : modifications) { + mods += modification.process(transaction); + broker.flush(); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("{} modifications processed.", mods); + } + + return mods; + + } else { + return 0; + } } catch (final IOException e) { throw new EXistException("An exception occurred while compiling the query: " + e.getMessage()); } - - final Sequence seq = queryResult.result; - if (seq.effectiveBooleanValue()) { - long mods = 0; - for (final Modification modification : modifications) { - mods += modification.process(transaction); - broker.flush(); - } - - if (LOG.isDebugEnabled()) { - LOG.debug("{} modifications processed.", mods); - } - - return mods; - - } else { - return 0; - } } @Override diff --git a/exist-core/src/main/java/org/exist/xupdate/Modification.java b/exist-core/src/main/java/org/exist/xupdate/Modification.java index 6231d80e0a..5dc7cad535 100644 --- a/exist-core/src/main/java/org/exist/xupdate/Modification.java +++ b/exist-core/src/main/java/org/exist/xupdate/Modification.java @@ -182,24 +182,21 @@ protected NodeList select(final DocumentSet docs) throws PermissionDeniedExcepti declareVariables(xqueryContext); }; - final XQueryUtil.QueryResult queryResult; - try { - queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, null, null); - } catch (final IOException e) { - throw new EXistException("An exception occurred while compiling the query: " + e.getMessage()); - } + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, true, null, null, setupXqueryContextPreCompilation, null, null)) { + final Sequence resultSeq = queryResult.result; + if (!(resultSeq.isEmpty() || Type.subTypeOf(resultSeq.getItemType(), Type.NODE))) { + throw new EXistException("select expression should evaluate to a node-set; got " + + Type.getTypeName(resultSeq.getItemType())); + } - final Sequence resultSeq = queryResult.result; - if (!(resultSeq.isEmpty() || Type.subTypeOf(resultSeq.getItemType(), Type.NODE))) { - throw new EXistException("select expression should evaluate to a node-set; got " + - Type.getTypeName(resultSeq.getItemType())); - } + if (LOG.isDebugEnabled()) { + LOG.debug("found {} for select: {}", resultSeq.getItemCount(), selectStmt); + } - if (LOG.isDebugEnabled()) { - LOG.debug("found {} for select: {}", resultSeq.getItemCount(), selectStmt); + return resultSeq.toNodeSet(); + } catch (final IOException e) { + throw new EXistException("An exception occurred while compiling the query: " + e.getMessage()); } - - return resultSeq.toNodeSet(); } /** diff --git a/exist-core/src/main/java/org/exist/xupdate/XUpdateProcessor.java b/exist-core/src/main/java/org/exist/xupdate/XUpdateProcessor.java index aeabc390f7..843fca9cdd 100644 --- a/exist-core/src/main/java/org/exist/xupdate/XUpdateProcessor.java +++ b/exist-core/src/main/java/org/exist/xupdate/XUpdateProcessor.java @@ -514,29 +514,32 @@ public void startElement(final String namespaceURI, final String localName, fina if (select == null) { throw new SAXException("value-of requires a select attribute"); } - final Sequence seq = processQuery(select); - if (LOG.isDebugEnabled()) { - LOG.debug("Found {} items for value-of", seq.getItemCount()); - } - Item item; - try { - for (final SequenceIterator i = seq.iterate(); i.hasNext(); ) { - item = i.nextItem(); - if (Type.subTypeOf(item.getType(), Type.NODE)) { - final Node node = NodeSetHelper.copyNode(doc, ((NodeValue) item).getNode()); - final Element last = stack.peek(); - if (last == null) { - contents.add(node); + + try (final XQueryUtil.QueryResult queryResult = processQuery(select)) { + final Sequence seq = queryResult.result; + if (LOG.isDebugEnabled()) { + LOG.debug("Found {} items for value-of", seq.getItemCount()); + } + + try { + for (final SequenceIterator i = seq.iterate(); i.hasNext(); ) { + final Item item = i.nextItem(); + if (Type.subTypeOf(item.getType(), Type.NODE)) { + final Node node = NodeSetHelper.copyNode(doc, ((NodeValue) item).getNode()); + final Element last = stack.peek(); + if (last == null) { + contents.add(node); + } else { + last.appendChild(node); + } } else { - last.appendChild(node); + final String value = item.getStringValue(); + characters(value.toCharArray(), 0, value.length()); } - } else { - final String value = item.getStringValue(); - characters(value.toCharArray(), 0, value.length()); } + } catch (final XPathException e) { + throw new SAXException(e.getMessage(), e); } - } catch (final XPathException e) { - throw new SAXException(e.getMessage(), e); } break; } @@ -737,19 +740,20 @@ private void createVariable(final String name, final String select) throws SAXEx LOG.debug("Creating variable {} as {}", name, select); } - final Sequence result = processQuery(select); - - if (LOG.isDebugEnabled()) { - LOG.debug("Found {} for variable {}", result.getItemCount(), name); - } + try (final XQueryUtil.QueryResult queryResult = processQuery(select)) { + final Sequence result = queryResult.result; + if (LOG.isDebugEnabled()) { + LOG.debug("Found {} for variable {}", result.getItemCount(), name); + } - if (variables == null) { - variables = new Object2ObjectRBTreeMap<>(); - } - variables.put(name, result); + if (variables == null) { + variables = new Object2ObjectRBTreeMap<>(); + } + variables.put(name, result); + } } - private Sequence processQuery(final String select) throws SAXException { + private XQueryUtil.QueryResult processQuery(final String select) throws SAXException { try { final ConsumerE setupXqueryContextPreCompilation = xqueryContext -> { @@ -774,8 +778,8 @@ private Sequence processQuery(final String select) throws SAXException { } }; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(select), false, null, null, setupXqueryContextPreCompilation, null, null); - return queryResult.result; + return XQueryUtil.query(broker, new StringSource(select), false, null, null, setupXqueryContextPreCompilation, null, null); + } catch (final IOException | PermissionDeniedException | XPathException e) { throw new SAXException(e); } diff --git a/exist-core/src/test/java/org/exist/Indexer2Test.java b/exist-core/src/test/java/org/exist/Indexer2Test.java index c2999384e2..c402130d09 100644 --- a/exist-core/src/test/java/org/exist/Indexer2Test.java +++ b/exist-core/src/test/java/org/exist/Indexer2Test.java @@ -134,9 +134,10 @@ public void retrieve_boundary_space_preserve_with_preserve_mixed_ws() throws EXi private String executeQuery() throws EXistException, PermissionDeniedException, SAXException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); - final StringBuilderWriter out = new StringBuilderWriter()) { + final StringBuilderWriter out = new StringBuilderWriter(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(XQUERY), false, null, null, null, null, null)) { - final Sequence result = XQueryUtil.query(broker, new StringSource(XQUERY), false, null, null, null, null, null).result; + final Sequence result = queryResult.result; final Properties props = new Properties(); props.setProperty(OutputKeys.INDENT, "yes"); final SAXSerializer serializer = new SAXSerializer(out, props); diff --git a/exist-core/src/test/java/org/exist/Indexer3Test.java b/exist-core/src/test/java/org/exist/Indexer3Test.java index 2eea0647b1..3722f757f4 100644 --- a/exist-core/src/test/java/org/exist/Indexer3Test.java +++ b/exist-core/src/test/java/org/exist/Indexer3Test.java @@ -376,9 +376,10 @@ private String store_and_retrieve_suppress_type(final String type, final String store_suppress_type(type, typeXml); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); - final StringBuilderWriter out = new StringBuilderWriter()) { + final StringBuilderWriter out = new StringBuilderWriter(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(typeXquery), false, null, null, null, null, null)) { - final Sequence result = XQueryUtil.query(broker, new StringSource(typeXquery), false, null, null, null, null, null).result; + final Sequence result = queryResult.result; final Properties props = new Properties(); props.setProperty(OutputKeys.INDENT, "no"); final SAXSerializer serializer = new SAXSerializer(out, props); diff --git a/exist-core/src/test/java/org/exist/IndexerTest.java b/exist-core/src/test/java/org/exist/IndexerTest.java index 540f1693b0..4f89ec7ecd 100644 --- a/exist-core/src/test/java/org/exist/IndexerTest.java +++ b/exist-core/src/test/java/org/exist/IndexerTest.java @@ -216,9 +216,10 @@ private void store_preserve_ws_mixed_content_value(final boolean propValue, fina private String store_and_retrieve_ws_mixed_content_value(final boolean preserve, final String typeXml, final String typeXquery) throws EXistException, IOException, LockException, AuthenticationException, PermissionDeniedException, SAXException, XPathException { store_preserve_ws_mixed_content_value(preserve, typeXml); final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(typeXquery), false, null, null, null, null, null)) { - final Sequence result = XQueryUtil.query(broker, new StringSource(typeXquery), false, null, null, null, null, null).result; + final Sequence result = queryResult.result; try (final StringBuilderWriter out = new StringBuilderWriter()) { final Properties props = new Properties(); props.setProperty(OutputKeys.INDENT, "yes"); diff --git a/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetGidTest.java b/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetGidTest.java index ff7d081053..cc41a50f2b 100644 --- a/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetGidTest.java +++ b/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetGidTest.java @@ -201,15 +201,17 @@ public void triggerSetGid() throws EXistException, PermissionDeniedException, IO try (final Txn transaction = pool.getTransactionManager().beginTransaction(); final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryBeforeRealGroup), false, null, null, null, null, null); - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - assertEquals(GUEST_GROUP, queryResult.result.itemAt(0).getStringValue()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryBeforeRealGroup), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + assertEquals(GUEST_GROUP, queryResult.result.itemAt(0).getStringValue()); + } - queryResult = XQueryUtil.query(broker, new StringSource(queryBeforeEffectiveGroup), false, null, null, null, null, null); - assertNotNull(queryResult.result); - assertEquals(2, queryResult.result.getItemCount()); - assertEquals(DBA_GROUP + "," + GUEST_GROUP, queryResult.result.itemAt(0).getStringValue() + "," + queryResult.result.itemAt(1).getStringValue()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryBeforeEffectiveGroup), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(2, queryResult.result.getItemCount()); + assertEquals(DBA_GROUP + "," + GUEST_GROUP, queryResult.result.itemAt(0).getStringValue() + "," + queryResult.result.itemAt(1).getStringValue()); + } transaction.commit(); } @@ -225,15 +227,17 @@ public void triggerSetGid() throws EXistException, PermissionDeniedException, IO try (final Txn transaction = pool.getTransactionManager().beginTransaction(); final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryAfterRealGroup), false, null, null, null, null, null); - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - assertEquals(GUEST_GROUP, queryResult.result.itemAt(0).getStringValue()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryAfterRealGroup), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + assertEquals(GUEST_GROUP, queryResult.result.itemAt(0).getStringValue()); + } - queryResult = XQueryUtil.query(broker, new StringSource(queryAfterEffectiveGroup), false, null, null, null, null, null); - assertNotNull(queryResult.result); - assertEquals(2, queryResult.result.getItemCount()); - assertEquals(DBA_GROUP + "," + GUEST_GROUP, queryResult.result.itemAt(0).getStringValue() + "," + queryResult.result.itemAt(1).getStringValue()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryAfterEffectiveGroup), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(2, queryResult.result.getItemCount()); + assertEquals(DBA_GROUP + "," + GUEST_GROUP, queryResult.result.itemAt(0).getStringValue() + "," + queryResult.result.itemAt(1).getStringValue()); + } transaction.commit(); } diff --git a/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetUidTest.java b/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetUidTest.java index 35d4158758..67e049b0c7 100644 --- a/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetUidTest.java +++ b/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerSetUidTest.java @@ -201,16 +201,18 @@ public void triggerSetUid() throws EXistException, PermissionDeniedException, IO try (final Txn transaction = pool.getTransactionManager().beginTransaction(); final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryBeforeRealUser), false, null, null, null, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryBeforeRealUser), false, null, null, null, null, null)) { - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - assertEquals(GUEST_USER, queryResult.result.itemAt(0).getStringValue()); + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + assertEquals(GUEST_USER, queryResult.result.itemAt(0).getStringValue()); + } - queryResult = XQueryUtil.query(broker, new StringSource(queryBeforeEffectiveUser), false, null, null, null, null, null); - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - assertEquals(DBA_USER, queryResult.result.itemAt(0).getStringValue()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryBeforeEffectiveUser), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + assertEquals(DBA_USER, queryResult.result.itemAt(0).getStringValue()); + } transaction.commit(); } @@ -226,15 +228,17 @@ public void triggerSetUid() throws EXistException, PermissionDeniedException, IO try (final Txn transaction = pool.getTransactionManager().beginTransaction(); final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryAfterRealUser), false, null, null, null, null, null); - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - assertEquals(GUEST_USER, queryResult.result.itemAt(0).getStringValue()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryAfterRealUser), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + assertEquals(GUEST_USER, queryResult.result.itemAt(0).getStringValue()); + } - queryResult = XQueryUtil.query(broker, new StringSource(queryAfterEffectiveUser), false, null, null, null, null, null); - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - assertEquals(DBA_USER, queryResult.result.itemAt(0).getStringValue()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(queryAfterEffectiveUser), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + assertEquals(DBA_USER, queryResult.result.itemAt(0).getStringValue()); + } transaction.commit(); } diff --git a/exist-core/src/test/java/org/exist/dom/memtree/DOMIndexerTest.java b/exist-core/src/test/java/org/exist/dom/memtree/DOMIndexerTest.java index 764f175e7d..a1b70cef8e 100644 --- a/exist-core/src/test/java/org/exist/dom/memtree/DOMIndexerTest.java +++ b/exist-core/src/test/java/org/exist/dom/memtree/DOMIndexerTest.java @@ -146,9 +146,10 @@ public void store() throws PermissionDeniedException, IOException, EXistExceptio public void xQuery() throws EXistException, PermissionDeniedException, SAXException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); - final StringBuilderWriter out = new StringBuilderWriter()) { + final StringBuilderWriter out = new StringBuilderWriter(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(XQUERY), false, null, null, null, null, null)) { - final Sequence result = XQueryUtil.query(broker, new StringSource(XQUERY), false, null, null, null, null, null).result; + final Sequence result = queryResult.result; final Properties props = new Properties(); props.setProperty(OutputKeys.INDENT, "yes"); final SAXSerializer serializer = new SAXSerializer(out, props); diff --git a/exist-core/src/test/java/org/exist/dom/persistent/BasicNodeSetTest.java b/exist-core/src/test/java/org/exist/dom/persistent/BasicNodeSetTest.java index 9d0e89705b..6431d187a9 100644 --- a/exist-core/src/test/java/org/exist/dom/persistent/BasicNodeSetTest.java +++ b/exist-core/src/test/java/org/exist/dom/persistent/BasicNodeSetTest.java @@ -125,110 +125,106 @@ public class BasicNodeSetTest { ""; private static Collection root = null; - private static Sequence seqSpeech = null; + private static XQueryUtil.QueryResult seqSpeech = null; private static DocumentSet docs = null; @Test public void childSelector() throws XPathException, EXistException { - NodeSelector selector = new ChildSelector(seqSpeech.toNodeSet(), -1); - NameTest test = new NameTest(Type.ELEMENT, new QName("LINE", "")); - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - NodeSet set = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, seqSpeech.getDocumentSet(), test.getName(), selector); - + final NodeSelector selector = new ChildSelector(seqSpeech.result.toNodeSet(), -1); + final NameTest test = new NameTest(Type.ELEMENT, new QName("LINE", "")); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + final NodeSet set = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, seqSpeech.result.getDocumentSet(), test.getName(), selector); assertEquals(9492, set.getLength()); } } @Test public void descendantOrSelfSelector() throws XPathException, EXistException { - NodeSelector selector = new DescendantOrSelfSelector(seqSpeech.toNodeSet(), -1); - NameTest test = new NameTest(Type.ELEMENT, new QName("SPEECH", "")); - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - NodeSet set = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, seqSpeech.getDocumentSet(), test.getName(), selector); - + final NodeSelector selector = new DescendantOrSelfSelector(seqSpeech.result.toNodeSet(), -1); + final NameTest test = new NameTest(Type.ELEMENT, new QName("SPEECH", "")); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + final NodeSet set = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, seqSpeech.result.getDocumentSet(), test.getName(), selector); assertEquals(2628, set.getLength()); } } @Test public void ancestorSelector() throws XPathException, EXistException { - NodeSelector selector = new AncestorSelector(seqSpeech.toNodeSet(), -1, false, true); - NameTest test = new NameTest(Type.ELEMENT, new QName("ACT", "")); - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - NodeSet set = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, seqSpeech.getDocumentSet(), test.getName(), selector); - + final NodeSelector selector = new AncestorSelector(seqSpeech.result.toNodeSet(), -1, false, true); + final NameTest test = new NameTest(Type.ELEMENT, new QName("ACT", "")); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + final NodeSet set = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, seqSpeech.result.getDocumentSet(), test.getName(), selector); assertEquals(15, set.getLength()); } } @Test public void ancestorSelector_self() throws XPathException, EXistException { - NodeSet ns = seqSpeech.toNodeSet(); - NodeSelector selector = new AncestorSelector(ns, -1, true, true); - NameTest test = new NameTest(Type.ELEMENT, new QName("SPEECH", "")); - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - NodeSet set = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, seqSpeech.getDocumentSet(), test.getName(), selector); - + final NodeSet ns = seqSpeech.result.toNodeSet(); + final NodeSelector selector = new AncestorSelector(ns, -1, true, true); + final NameTest test = new NameTest(Type.ELEMENT, new QName("SPEECH", "")); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + final NodeSet set = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, seqSpeech.result.getDocumentSet(), test.getName(), selector); assertEquals(2628, set.getLength()); } } @Test public void descendantSelector() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - Sequence seq = executeQuery(broker, "//SCENE", 72, null); - NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); - NodeSelector selector = new DescendantSelector(seq.toNodeSet(), -1); - NodeSet set = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, seq.getDocumentSet(), test.getName(), selector); - + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SCENE", 72, null)) { + final Sequence seq = queryResult.result; + final NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); + final NodeSelector selector = new DescendantSelector(seq.toNodeSet(), -1); + final NodeSet set = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, seq.getDocumentSet(), test.getName(), selector); assertEquals(2639, set.getLength()); } } @Test public void selectParentChild() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); - Sequence smallSet = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'perturbed spirit')]/ancestor::SPEECH", 1, null); - - NodeSet result = NodeSetHelper.selectParentChild(speakers, smallSet.toNodeSet(), NodeSet.DESCENDANT, -1); + final NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'perturbed spirit')]/ancestor::SPEECH", 1, null)) { + final Sequence smallSet = queryResult.result; + final NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); + final NodeSet result = NodeSetHelper.selectParentChild(speakers, smallSet.toNodeSet(), NodeSet.DESCENDANT, -1); assertEquals(1, result.getLength()); - String value = serialize(broker, result.itemAt(0)); + final String value = serialize(broker, result.itemAt(0)); assertEquals(value, "HAMLET"); } } @Test public void selectParentChild_2() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); - Sequence largeSet = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'love')]/ancestor::SPEECH", 187, null); - - NodeSet result = NodeSetHelper.selectParentChild(speakers, largeSet.toNodeSet(), NodeSet.DESCENDANT, -1); + final NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'love')]/ancestor::SPEECH", 187, null)) { + final Sequence largeSet = queryResult.result; + final NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); + final NodeSet result = NodeSetHelper.selectParentChild(speakers, largeSet.toNodeSet(), NodeSet.DESCENDANT, -1); assertEquals(187, result.getLength()); } } @Test public void selectAncestorDescendant() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); - Sequence outerSet = executeQuery(broker, "//SCENE/TITLE[fn:contains(., 'closet')]/ancestor::SCENE", 1, null); - - NodeSet result = speakers.selectAncestorDescendant(outerSet.toNodeSet(), NodeSet.DESCENDANT, false, -1, true); + final NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SCENE/TITLE[fn:contains(., 'closet')]/ancestor::SCENE", 1, null)) { + final Sequence outerSet = queryResult.result; + final NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); + final NodeSet result = speakers.selectAncestorDescendant(outerSet.toNodeSet(), NodeSet.DESCENDANT, false, -1, true); assertEquals(56, result.getLength()); } } @Test public void selectAncestorDescendant_2() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - Sequence outerSet = executeQuery(broker, "//SCENE/TITLE[fn:contains(., 'closet')]/ancestor::SCENE", 1, null); - - NodeSet result = ((AbstractNodeSet) outerSet).selectAncestorDescendant(outerSet.toNodeSet(), NodeSet.DESCENDANT, true, -1, true); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SCENE/TITLE[fn:contains(., 'closet')]/ancestor::SCENE", 1, null)) { + final Sequence outerSet = queryResult.result; + final NodeSet result = ((AbstractNodeSet) outerSet).selectAncestorDescendant(outerSet.toNodeSet(), NodeSet.DESCENDANT, true, -1, true); assertEquals(1, result.getLength()); } } @@ -236,73 +232,63 @@ public void selectAncestorDescendant_2() throws XPathException, SAXException, Pe @Test public void getParents() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - Sequence largeSet = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'love')]/ancestor::SPEECH", 187, null); - - NodeSet result = ((AbstractNodeSet) largeSet).getParents(-1); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'love')]/ancestor::SPEECH", 187, null)) { + final Sequence largeSet = queryResult.result; + final NodeSet result = ((AbstractNodeSet) largeSet).getParents(-1); assertEquals(51, result.getLength()); } } @Test public void selectAncestors() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - NameTest test = new NameTest(Type.ELEMENT, new QName("SCENE", "")); - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - NodeSet scenes = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); - Sequence largeSet = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'love')]/ancestor::SPEECH", 187, null); - - NodeSet result = ((AbstractNodeSet) scenes).selectAncestors(largeSet.toNodeSet(), false, -1); + final NameTest test = new NameTest(Type.ELEMENT, new QName("SCENE", "")); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'love')]/ancestor::SPEECH", 187, null)) { + final Sequence largeSet = queryResult.result; + final NodeSet scenes = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); + final NodeSet result = ((AbstractNodeSet) scenes).selectAncestors(largeSet.toNodeSet(), false, -1); assertEquals(49, result.getLength()); } } @Test public void getElementsByTagNameWildcard() throws LockException, PermissionDeniedException, EXistException { - DocumentImpl doc = null; - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); final LockedDocument lockedDoc = root.getDocumentWithLock(broker, XmldbURI.create("hamlet.xml"), Lock.LockMode.READ_LOCK)) { final NodeList elements = lockedDoc.getDocument().getElementsByTagName(QName.WILDCARD); - assertEquals(6636, elements.getLength()); } } @Test public void getElementsByTagNameNSWildcard() throws LockException, PermissionDeniedException, EXistException { - DocumentImpl doc = null; - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); final LockedDocument lockedDoc = root.getDocumentWithLock(broker, XmldbURI.create("hamlet.xml"), Lock.LockMode.READ_LOCK)) { final NodeList elements = lockedDoc.getDocument().getElementsByTagNameNS(QName.WILDCARD, QName.WILDCARD); - assertEquals(6636, elements.getLength()); - } } @Test public void getElementsByTagNameWildcardNS() throws LockException, PermissionDeniedException, EXistException { - DocumentImpl doc = null; try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); final LockedDocument lockedDoc = root.getDocumentWithLock(broker, XmldbURI.create("hamlet.xml"), Lock.LockMode.READ_LOCK)) { final NodeList elements = lockedDoc.getDocument().getElementsByTagNameNS(QName.WILDCARD, "SPEECH"); - assertEquals(1138, elements.getLength()); } } @Test public void nodeProxy_getParents() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - Sequence smallSet = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'perturbed spirit')]/ancestor::SPEECH", 1, null); - - NodeProxy proxy = (NodeProxy) smallSet.itemAt(0); - + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'perturbed spirit')]/ancestor::SPEECH", 1, null)) { + final Sequence smallSet = queryResult.result; + final NodeProxy proxy = (NodeProxy) smallSet.itemAt(0); NodeSet result = proxy.getParents(-1); assertEquals(1, result.getLength()); - - NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); - NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); - + final NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); + final NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); result = speakers.selectParentChild(proxy, NodeSet.DESCENDANT, -1); assertEquals(1, result.getLength()); } @@ -310,231 +296,262 @@ public void nodeProxy_getParents() throws XPathException, SAXException, Permissi @Test public void selectFollowingSiblings() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - Sequence largeSet = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'love')]/ancestor::SPEECH/SPEAKER", 187, null); - NameTest test = new NameTest(Type.ELEMENT, new QName("LINE", "")); - NodeSet lines = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); - - NodeSet result = ((AbstractNodeSet) lines).selectFollowingSiblings(largeSet.toNodeSet(), -1); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'love')]/ancestor::SPEECH/SPEAKER", 187, null)) { + final Sequence largeSet = queryResult.result; + final NameTest test = new NameTest(Type.ELEMENT, new QName("LINE", "")); + final NodeSet lines = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); + final NodeSet result = lines.selectFollowingSiblings(largeSet.toNodeSet(), -1); assertEquals(1689, result.getLength()); } } @Test public void selectPrecedingSiblings() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); - Sequence largeSet = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'love')]/ancestor::SPEECH/LINE[1]", 187, null); - - NodeSet result = ((AbstractNodeSet) speakers).selectPrecedingSiblings(largeSet.toNodeSet(), -1); + final NameTest test = new NameTest(Type.ELEMENT, new QName("SPEAKER", "")); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SPEECH/LINE[fn:contains(., 'love')]/ancestor::SPEECH/LINE[1]", 187, null)) { + final NodeSet speakers = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); + final Sequence largeSet = queryResult.result; + final NodeSet result = speakers.selectPrecedingSiblings(largeSet.toNodeSet(), -1); assertEquals(187, result.getLength()); } } @Test public void extArrayNodeSet_selectParentChild_1() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - Sequence nestedSet = executeQuery(broker, "//section[@n = ('1.1', '1.1.1')]", 2, null); - NameTest test = new NameTest(Type.ELEMENT, new QName("para", "")); - NodeSet children = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); - - NodeSet result = children.selectParentChild(nestedSet.toNodeSet(), NodeSet.DESCENDANT); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//section[@n = ('1.1', '1.1.1')]", 2, null)) { + final Sequence nestedSet = queryResult.result; + final NameTest test = new NameTest(Type.ELEMENT, new QName("para", "")); + final NodeSet children = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); + final NodeSet result = children.selectParentChild(nestedSet.toNodeSet(), NodeSet.DESCENDANT); assertEquals(3, result.getLength()); } } @Test public void extArrayNodeSet_selectParentChild_2() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - Sequence nestedSet = executeQuery(broker, "//section[@n = ('1.1', '1.1.2', '1.2')]", 3, null); - NameTest test = new NameTest(Type.ELEMENT, new QName("para", "")); - NodeSet children = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); - - NodeSet result = children.selectParentChild(nestedSet.toNodeSet(), NodeSet.DESCENDANT); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//section[@n = ('1.1', '1.1.2', '1.2')]", 3, null)) { + final Sequence nestedSet = queryResult.result; + final NameTest test = new NameTest(Type.ELEMENT, new QName("para", "")); + final NodeSet children = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); + final NodeSet result = children.selectParentChild(nestedSet.toNodeSet(), NodeSet.DESCENDANT); assertEquals(2, result.getLength()); } } @Test public void extArrayNodeSet_selectParentChild_3() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - Sequence nestedSet = executeQuery(broker, "//section[@n = ('1.1', '1.1.1', '1.2')]", 3, null); - NameTest test = new NameTest(Type.ELEMENT, new QName("para", "")); - NodeSet children = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); - - NodeSet result = children.selectParentChild(nestedSet.toNodeSet(), NodeSet.DESCENDANT); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//section[@n = ('1.1', '1.1.1', '1.2')]", 3, null)) { + final Sequence nestedSet = queryResult.result; + final NameTest test = new NameTest(Type.ELEMENT, new QName("para", "")); + final NodeSet children = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); + final NodeSet result = children.selectParentChild(nestedSet.toNodeSet(), NodeSet.DESCENDANT); assertEquals(4, result.getLength()); } } @Test public void extArrayNodeSet_selectParentChild_4() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - Sequence nestedSet = executeQuery(broker, "//para[@n = ('1.1.2.1')]", 1, null); - NameTest test = new NameTest(Type.ELEMENT, new QName("section", "")); - NodeSet sections = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); - - NodeSet result = ((NodeSet) nestedSet).selectParentChild(sections.toNodeSet(), NodeSet.DESCENDANT); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//para[@n = ('1.1.2.1')]", 1, null)) { + final Sequence nestedSet = queryResult.result; + final NameTest test = new NameTest(Type.ELEMENT, new QName("section", "")); + final NodeSet sections = broker.getStructuralIndex().findElementsByTagName(ElementValue.ELEMENT, docs, test.getName(), null); + final NodeSet result = ((NodeSet) nestedSet).selectParentChild(sections.toNodeSet(), NodeSet.DESCENDANT); assertEquals(1, result.getLength()); } } @Test public void testOptimizations() throws XPathException, SAXException, PermissionDeniedException, EXistException, LockException, IOException { - try(final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - DocumentSet docs = root.allDocs(broker, new DefaultDocumentSet(), true); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { + final DocumentSet docs = root.allDocs(broker, new DefaultDocumentSet(), true); //Testing NativeElementIndex.findChildNodesByTagName // parent set: 1.1.1; child set: 1.1.1.1, 1.1.1.2, 1.1.1.3, 1.1.2.1, 1.2.1 - ExtNodeSet nestedSet = (ExtNodeSet) executeQuery(broker, "//section[@n = '1.1.1']", 1, null); - NodeSet children = + try (final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//section[@n = '1.1.1']", 1, null)) { + final ExtNodeSet nestedSet = (ExtNodeSet) queryResult.result; + final NodeSet children = broker.getStructuralIndex().findDescendantsByTagName(ElementValue.ELEMENT, - new QName("para", ""), Constants.CHILD_AXIS, docs, nestedSet, -1); - assertEquals(3, children.getLength()); + new QName("para", ""), Constants.CHILD_AXIS, docs, nestedSet, -1); + assertEquals(3, children.getLength()); + } // parent set: 1.1; child set: 1.1.1, 1.1.2 - nestedSet = (ExtNodeSet) executeQuery(broker, "//section[@n = '1.1']", 1, null); - children = + try (final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//section[@n = '1.1']", 1, null)) { + final ExtNodeSet nestedSet = (ExtNodeSet) queryResult.result; + final NodeSet children = broker.getStructuralIndex().findDescendantsByTagName(ElementValue.ELEMENT, - new QName("section", ""), Constants.CHILD_AXIS, docs, nestedSet, -1); - assertEquals(2, children.getLength()); + new QName("section", ""), Constants.CHILD_AXIS, docs, nestedSet, -1); + assertEquals(2, children.getLength()); + } // parent set: 1, 1.1, 1.1.1, 1.1.2 ; child set: 1.1.1.1, 1.1.1.2, 1.1.1.3, 1.1.2.1, 1.2.1 // problem: ancestor set contains nested nodes - nestedSet = (ExtNodeSet) executeQuery(broker, "//section[@n = ('1.1', '1.1.1', '1.1.2')]", 3, null); - children = + try (final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//section[@n = ('1.1', '1.1.1', '1.1.2')]", 3, null)) { + final ExtNodeSet nestedSet = (ExtNodeSet) queryResult.result; + final NodeSet children = broker.getStructuralIndex().findDescendantsByTagName(ElementValue.ELEMENT, - new QName("para", ""), Constants.CHILD_AXIS, docs, nestedSet, -1); - assertEquals(4, children.getLength()); + new QName("para", ""), Constants.CHILD_AXIS, docs, nestedSet, -1); + assertEquals(4, children.getLength()); + } // parent set: 1.1, 1.1.2, 1.2 ; child set: 1.1.1.1, 1.1.1.2, 1.1.1.3, 1.1.2.1, 1.2.1 // problem: ancestor set contains nested nodes - nestedSet = (ExtNodeSet) executeQuery(broker, "//section[@n = ('1.1', '1.1.2', '1.2')]", 3, null); - children = + try (final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//section[@n = ('1.1', '1.1.2', '1.2')]", 3, null)) { + final ExtNodeSet nestedSet = (ExtNodeSet) queryResult.result; + final NodeSet children = broker.getStructuralIndex().findDescendantsByTagName(ElementValue.ELEMENT, new QName("para", ""), - Constants.CHILD_AXIS, docs, nestedSet, -1); - assertEquals(2, children.getLength()); + Constants.CHILD_AXIS, docs, nestedSet, -1); + assertEquals(2, children.getLength()); + } - nestedSet = (ExtNodeSet) executeQuery(broker, "//section[@n = '1.1']", 1, null); - children = + try (final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//section[@n = '1.1']", 1, null)) { + final ExtNodeSet nestedSet = (ExtNodeSet) queryResult.result; + final NodeSet children = broker.getStructuralIndex().findDescendantsByTagName(ElementValue.ELEMENT, new QName("para", ""), - Constants.DESCENDANT_AXIS, docs, nestedSet, -1); - assertEquals(4, children.getLength()); + Constants.DESCENDANT_AXIS, docs, nestedSet, -1); + assertEquals(4, children.getLength()); + } - nestedSet = (ExtNodeSet) executeQuery(broker, "//section[@n = '1']", 1, null); - children = + try (final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//section[@n = '1']", 1, null)) { + final ExtNodeSet nestedSet = (ExtNodeSet) queryResult.result; + final NodeSet children = broker.getStructuralIndex().findDescendantsByTagName(ElementValue.ELEMENT, new QName("para", ""), - Constants.DESCENDANT_AXIS, docs, nestedSet, -1); - assertEquals(5, children.getLength()); + Constants.DESCENDANT_AXIS, docs, nestedSet, -1); + assertEquals(5, children.getLength()); + } - nestedSet = (ExtNodeSet) executeQuery(broker, "//section[@n = '1.1.2']", 1, null); - children = + try (final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//section[@n = '1.1.2']", 1, null)) { + final ExtNodeSet nestedSet = (ExtNodeSet) queryResult.result; + final NodeSet children = broker.getStructuralIndex().findDescendantsByTagName(ElementValue.ELEMENT, new QName("section", ""), - Constants.DESCENDANT_SELF_AXIS, docs, nestedSet, -1); - assertEquals(1, children.getLength()); + Constants.DESCENDANT_SELF_AXIS, docs, nestedSet, -1); + assertEquals(1, children.getLength()); + } - nestedSet = (ExtNodeSet) executeQuery(broker, "//section[@n = '1.1.2']", 1, null); - children = + try (final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//section[@n = '1.1.2']", 1, null)) { + final ExtNodeSet nestedSet = (ExtNodeSet) queryResult.result; + final NodeSet children = broker.getStructuralIndex().findDescendantsByTagName(ElementValue.ATTRIBUTE, new QName("n", ""), - Constants.ATTRIBUTE_AXIS, docs, nestedSet, -1); - assertEquals(1, children.getLength()); + Constants.ATTRIBUTE_AXIS, docs, nestedSet, -1); + assertEquals(1, children.getLength()); + } - nestedSet = (ExtNodeSet) executeQuery(broker, "//section[@n = '1.1']", 1, null); - children = + try (final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//section[@n = '1.1']", 1, null)) { + final ExtNodeSet nestedSet = (ExtNodeSet) queryResult.result; + final NodeSet children = broker.getStructuralIndex().findDescendantsByTagName(ElementValue.ATTRIBUTE, new QName("n", ""), - Constants.DESCENDANT_ATTRIBUTE_AXIS, docs, nestedSet, -1); - assertEquals(7, children.getLength()); + Constants.DESCENDANT_ATTRIBUTE_AXIS, docs, nestedSet, -1); + assertEquals(7, children.getLength()); + } } } @Test public void virtualNodeSet_1() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - executeQuery(broker, "//*/LINE", 9492, null); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//*/LINE", 9492, null)) { + // query result not used, but must be closed } } @Test public void virtualNodeSet_2() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - executeQuery(broker, "//*/LINE/*", 61, null); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//*/LINE/*", 61, null)) { + // query result not used, but must be closed } } @Test public void virtualNodeSet_3() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - executeQuery(broker, "//*/LINE/text()", 9485, null); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//*/LINE/text()", 9485, null)) { + // query result not used, but must be closed } } @Test public void virtualNodeSet_4() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - executeQuery(broker, "//SCENE/*/LINE", 9464, null); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SCENE/*/LINE", 9464, null)) { + // query result not used, but must be closed } } @Test public void virtualNodeSet_5() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - executeQuery(broker, "//SCENE/*[fn:contains(LINE, 'spirit')]", 30, null); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SCENE/*[fn:contains(LINE, 'spirit')]", 30, null)) { + // query result not used, but must be closed } } @Test public void virtualNodeSet_6() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - executeQuery(broker, "//SCENE/*[fn:contains(LINE, 'the')]", 1313, null); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SCENE/*[fn:contains(LINE, 'the')]", 1313, null)) { + // query result not used, but must be closed } } @Test public void virtualNodeSet_7() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - executeQuery(broker, "//SCENE/*/LINE[fn:contains(., 'the')]", 3198, null); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SCENE/*/LINE[fn:contains(., 'the')]", 3198, null)) { + // query result not used, but must be closed } } @Test public void virtualNodeSet_8() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - executeQuery(broker, "//SCENE[fn:contains(., 'spirit')]/ancestor::*", 16, null); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SCENE[fn:contains(., 'spirit')]/ancestor::*", 16, null)) { + // query result not used, but must be closed } } @Test public void virtualNodeSet_9() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - executeQuery(broker, "for $s in //SCENE/*[fn:contains(LINE, 'the')] return fn:node-name($s)", 1313, null); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "for $s in //SCENE/*[fn:contains(LINE, 'the')] return fn:node-name($s)", 1313, null)) { + // query result not used, but must be closed } } @Test public void virtualNodeSet_10() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - executeQuery(broker, "//SPEECH[fn:contains(LINE, 'perturbed spirit')]/preceding-sibling::*", 65, null); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SPEECH[fn:contains(LINE, 'perturbed spirit')]/preceding-sibling::*", 65, null)) { + // query result not used, but must be closed } } @Test public void virtualNodeSet_11() throws XPathException, SAXException, PermissionDeniedException, EXistException, IOException { - try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject()))) { - executeQuery(broker, "//SPEECH[fn:contains(LINE, 'perturbed spirit')]/following-sibling::*", 1, null); + try (final DBBroker broker = existEmbeddedServer.getBrokerPool().get(Optional.of(existEmbeddedServer.getBrokerPool().getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = executeQuery(broker, "//SPEECH[fn:contains(LINE, 'perturbed spirit')]/following-sibling::*", 1, null)) { + // query result not used, but must be closed } } - private static Sequence executeQuery(final DBBroker broker, final String query, final int expected, final String expectedResult) throws XPathException, SAXException, PermissionDeniedException, IOException { - final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(expected, seq.getItemCount()); + private static XQueryUtil.QueryResult executeQuery(final DBBroker broker, final String query, final int expected, final String expectedResult) throws XPathException, SAXException, PermissionDeniedException, IOException { + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(expected, seq.getItemCount()); - if (expectedResult != null) { - final Item item = seq.itemAt(0); - final String value = serialize(broker, item); - assertEquals(expectedResult, value); + if (expectedResult != null) { + final Item item = seq.itemAt(0); + final String value = serialize(broker, item); + assertEquals(expectedResult, value); + } + return queryResult; } - return seq; } private static String serialize(final DBBroker broker, final Item item) throws SAXException, XPathException { @@ -587,6 +604,8 @@ public static void setUp() throws EXistException, PermissionDeniedException, IOE @AfterClass public static void tearDown() throws PermissionDeniedException, IOException, TriggerException, EXistException { + seqSpeech.close(); + final BrokerPool pool = existEmbeddedServer.getBrokerPool(); final TransactionManager transact = pool.getTransactionManager(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); diff --git a/exist-core/src/test/java/org/exist/numbering/DLNStorageTest.java b/exist-core/src/test/java/org/exist/numbering/DLNStorageTest.java index 057090d1fd..fd2debcdaf 100644 --- a/exist-core/src/test/java/org/exist/numbering/DLNStorageTest.java +++ b/exist-core/src/test/java/org/exist/numbering/DLNStorageTest.java @@ -93,50 +93,59 @@ public void nodeStorage() throws Exception { // test element ids String query = "doc('/db/test/test_string.xml')/test/para"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(3, seq.getItemCount()); - NodeProxy comment = (NodeProxy) seq.itemAt(0); - assertEquals("1.1", comment.getNodeId().toString()); - comment = (NodeProxy) seq.itemAt(1); - assertEquals("1.3", comment.getNodeId().toString()); - comment = (NodeProxy) seq.itemAt(2); - assertEquals("1.5", comment.getNodeId().toString()); + Sequence seq; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + seq = queryResult.result; + assertEquals(3, seq.getItemCount()); + NodeProxy comment = (NodeProxy) seq.itemAt(0); + assertEquals("1.1", comment.getNodeId().toString()); + comment = (NodeProxy) seq.itemAt(1); + assertEquals("1.3", comment.getNodeId().toString()); + comment = (NodeProxy) seq.itemAt(2); + assertEquals("1.5", comment.getNodeId().toString()); + } query = "doc('/db/test/test_string.xml')/test//a"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(1, seq.getItemCount()); - NodeProxy a = (NodeProxy) seq.itemAt(0); - assertEquals("1.3.2", a.getNodeId().toString()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + seq = queryResult.result; + assertEquals(1, seq.getItemCount()); + NodeProxy a = (NodeProxy) seq.itemAt(0); + assertEquals("1.3.2", a.getNodeId().toString()); + } // test attribute id query = "doc('/db/test/test_string.xml')/test//a/@href"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(1, seq.getItemCount()); - NodeProxy href = (NodeProxy) seq.itemAt(0); - StorageAddress.toString(href); - assertEquals("1.3.2.1", href.getNodeId().toString()); - // test Attr deserialization - Attr attr = (Attr) href.getNode(); - StorageAddress.toString(((NodeHandle)attr)); - // test Attr fields - assertEquals("href", attr.getNodeName()); - assertEquals("href", attr.getName()); - assertEquals("#", attr.getValue()); - // test DOMFile.getNodeValue() - assertEquals("#", href.getStringValue()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + seq = queryResult.result; + assertEquals(1, seq.getItemCount()); + NodeProxy href = (NodeProxy) seq.itemAt(0); + StorageAddress.toString(href); + assertEquals("1.3.2.1", href.getNodeId().toString()); + // test Attr deserialization + Attr attr = (Attr) href.getNode(); + StorageAddress.toString(((NodeHandle) attr)); + // test Attr fields + assertEquals("href", attr.getNodeName()); + assertEquals("href", attr.getName()); + assertEquals("#", attr.getValue()); + // test DOMFile.getNodeValue() + assertEquals("#", href.getStringValue()); + } // test text node query = "doc('/db/test/test_string.xml')/test//b/text()"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(1, seq.getItemCount()); - NodeProxy text = (NodeProxy) seq.itemAt(0); - assertEquals("1.5.2.1", text.getNodeId().toString()); - // test DOMFile.getNodeValue() - assertEquals("paragraph", text.getStringValue()); - // test Text deserialization - Text node = (Text) text.getNode(); - assertEquals("paragraph", node.getNodeValue()); - assertEquals("paragraph", node.getData()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + seq = queryResult.result; + assertEquals(1, seq.getItemCount()); + NodeProxy text = (NodeProxy) seq.itemAt(0); + assertEquals("1.5.2.1", text.getNodeId().toString()); + // test DOMFile.getNodeValue() + assertEquals("paragraph", text.getStringValue()); + // test Text deserialization + Text node = (Text) text.getNode(); + assertEquals("paragraph", node.getNodeValue()); + assertEquals("paragraph", node.getData()); + } } } diff --git a/exist-core/src/test/java/org/exist/security/FnCollectionSecurityTest.java b/exist-core/src/test/java/org/exist/security/FnCollectionSecurityTest.java index 8a37287e18..57ab2eaa00 100644 --- a/exist-core/src/test/java/org/exist/security/FnCollectionSecurityTest.java +++ b/exist-core/src/test/java/org/exist/security/FnCollectionSecurityTest.java @@ -149,8 +149,9 @@ public void canAccessRoot() throws EXistException, AuthenticationException, Perm final Subject testUser1 = securityManager.authenticate(TEST_USER_1, TEST_USER_1); try (final DBBroker broker = pool.get(Optional.of(testUser1)); - final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + final Txn transaction = pool.getTransactionManager().beginTransaction(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; transaction.commit(); } @@ -166,8 +167,9 @@ public void canAccessCollection() throws EXistException, AuthenticationException final Subject testUser1 = securityManager.authenticate(TEST_USER_1, TEST_USER_1); try (final DBBroker broker = pool.get(Optional.of(testUser1)); - final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + final Txn transaction = pool.getTransactionManager().beginTransaction(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; transaction.commit(); } @@ -183,8 +185,9 @@ public void cannotAccessRestrictedCollection() throws EXistException, Authentica final Subject testUser1 = securityManager.authenticate(TEST_USER_1, TEST_USER_1); try (final DBBroker broker = pool.get(Optional.of(testUser1)); - final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + final Txn transaction = pool.getTransactionManager().beginTransaction(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; fail("Expected PermissionDeniedException via XPathException"); transaction.commit(); @@ -208,8 +211,9 @@ public void cannotAccessCollectionInCollectionHierarchyWithDeniedExecute() throw final Subject testUser1 = securityManager.authenticate(TEST_USER_1, TEST_USER_1); try (final DBBroker broker = pool.get(Optional.of(testUser1)); - final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + final Txn transaction = pool.getTransactionManager().beginTransaction(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; fail("Expected PermissionDeniedException via XPathException"); transaction.commit(); @@ -233,8 +237,9 @@ public void cannotAccessCollectionInCollectionHierarchyWithDeniedReadAndExecuteA final Subject testUser1 = securityManager.authenticate(TEST_USER_1, TEST_USER_1); try (final DBBroker broker = pool.get(Optional.of(testUser1)); - final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + final Txn transaction = pool.getTransactionManager().beginTransaction(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; fail("Expected PermissionDeniedException via XPathException"); transaction.commit(); diff --git a/exist-core/src/test/java/org/exist/security/FnDocSecurityTest.java b/exist-core/src/test/java/org/exist/security/FnDocSecurityTest.java index 201de5489b..68385b3839 100644 --- a/exist-core/src/test/java/org/exist/security/FnDocSecurityTest.java +++ b/exist-core/src/test/java/org/exist/security/FnDocSecurityTest.java @@ -159,8 +159,9 @@ public void canAccessDocument() throws EXistException, AuthenticationException, final Subject testUser1 = securityManager.authenticate(TEST_USER_1, TEST_USER_1); try (final DBBroker broker = pool.get(Optional.of(testUser1)); - final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + final Txn transaction = pool.getTransactionManager().beginTransaction(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; assertNotNull(result); assertEquals(1, result.getItemCount()); @@ -180,8 +181,9 @@ public void cannotAccessRestrictedDocument() throws EXistException, Authenticati final Subject testUser1 = securityManager.authenticate(TEST_USER_1, TEST_USER_1); try (final DBBroker broker = pool.get(Optional.of(testUser1)); - final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + final Txn transaction = pool.getTransactionManager().beginTransaction(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; fail("Expected PermissionDeniedException via XPathException"); transaction.commit(); @@ -205,8 +207,9 @@ public void cannotAccessDocumentInCollectionHierarchyWithDeniedExecute() throws final Subject testUser1 = securityManager.authenticate(TEST_USER_1, TEST_USER_1); try (final DBBroker broker = pool.get(Optional.of(testUser1)); - final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + final Txn transaction = pool.getTransactionManager().beginTransaction(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; fail("Expected PermissionDeniedException via XPathException"); transaction.commit(); @@ -230,8 +233,9 @@ public void cannotAccessDocumentInCollectionHierarchyWithDeniedReadAndExecuteAce final Subject testUser1 = securityManager.authenticate(TEST_USER_1, TEST_USER_1); try (final DBBroker broker = pool.get(Optional.of(testUser1)); - final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + final Txn transaction = pool.getTransactionManager().beginTransaction(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; fail("Expected PermissionDeniedException via XPathException"); transaction.commit(); diff --git a/exist-core/src/test/java/org/exist/security/SecurityManagerTest.java b/exist-core/src/test/java/org/exist/security/SecurityManagerTest.java index 6ab16397af..83191ff64d 100644 --- a/exist-core/src/test/java/org/exist/security/SecurityManagerTest.java +++ b/exist-core/src/test/java/org/exist/security/SecurityManagerTest.java @@ -200,13 +200,17 @@ public void deleteAccount() throws EXistException, PermissionDeniedException, XP private boolean removedAccountExists(final DBBroker broker, final String username) throws XPathException, PermissionDeniedException, IOException { final String query = "declare namespace config='http://exist-db.org/Configuration'; collection('" + REMOVED_ACCOUNTS_URI + "')//config:account[config:name eq '" + username + "']"; - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - return result.getItemCount() == 1 && result.itemAt(0).toJavaObject(Boolean.class) == true; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; + return result.getItemCount() == 1 && result.itemAt(0).toJavaObject(Boolean.class) == true; + } } private boolean removedGroupExists(final DBBroker broker, final String groupName) throws XPathException, PermissionDeniedException, IOException { final String query = "declare namespace config='http://exist-db.org/Configuration'; collection('" + REMOVED_GROUPS_URI + "')//config:group[config:name eq '" + groupName + "']"; - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - return result.getItemCount() == 1 && result.itemAt(0).toJavaObject(Boolean.class) == true; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; + return result.getItemCount() == 1 && result.itemAt(0).toJavaObject(Boolean.class) == true; + } } } diff --git a/exist-core/src/test/java/org/exist/security/XqueryApiTest.java b/exist-core/src/test/java/org/exist/security/XqueryApiTest.java index c502362975..848d795904 100644 --- a/exist-core/src/test/java/org/exist/security/XqueryApiTest.java +++ b/exist-core/src/test/java/org/exist/security/XqueryApiTest.java @@ -72,64 +72,66 @@ public class XqueryApiTest extends AbstractApiSecurityTest { @Override protected void createCol(final String collectionName, final String uid, final String pwd) throws ApiException { - final Sequence result = executeQuery(uid, pwd, "xmldb:create-collection('/db', '" + collectionName + "')"); - assertEquals("/db/" + collectionName, serialize(result)); + try (final XQueryUtil.QueryResult queryResult = executeQuery(uid, pwd, "xmldb:create-collection('/db', '" + collectionName + "')")) { + assertEquals("/db/" + collectionName, serialize(queryResult.result)); + } } @Override protected void removeCol(final String collectionName, final String uid, final String pwd) throws ApiException { - executeQuery(uid, pwd, "xmldb:remove('/db/" + collectionName + "')"); + executeQuery(uid, pwd, "xmldb:remove('/db/" + collectionName + "')").close(); } @Override protected void chownCol(final String collectionUri, final String owner_uid, final String group_gid, final String uid, final String pwd) throws ApiException { - executeQuery(uid, pwd, "sm:chown(xs:anyURI('" + collectionUri + "'), '" + owner_uid + ":" + group_gid + "')"); + executeQuery(uid, pwd, "sm:chown(xs:anyURI('" + collectionUri + "'), '" + owner_uid + ":" + group_gid + "')").close(); } @Override protected void chmodCol(final String collectionUri, final String mode, final String uid, final String pwd) throws ApiException { - executeQuery(uid, pwd, "sm:chmod(xs:anyURI('" + collectionUri + "'), '" + mode + "')"); + executeQuery(uid, pwd, "sm:chmod(xs:anyURI('" + collectionUri + "'), '" + mode + "')").close(); } @Override protected void chmodRes(final String resourceUri, final String mode, final String uid, final String pwd) throws ApiException { - executeQuery(uid, pwd, "sm:chmod(xs:anyURI('" + resourceUri + "'), '" + mode + "')"); + executeQuery(uid, pwd, "sm:chmod(xs:anyURI('" + resourceUri + "'), '" + mode + "')").close(); } @Override protected void chownRes(final String resourceUri, final String owner_uid, final String group_gid, final String uid, final String pwd) throws ApiException { - executeQuery(uid, pwd, "sm:chown(xs:anyURI('" + resourceUri + "'), '" + owner_uid + ":" + group_gid + "')"); + executeQuery(uid, pwd, "sm:chown(xs:anyURI('" + resourceUri + "'), '" + owner_uid + ":" + group_gid + "')").close(); } @Override protected void addCollectionUserAce(final String collectionUri, final String user_uid, final String mode, final boolean allow, final String uid, final String pwd) throws ApiException { - executeQuery(uid, pwd, "sm:add-user-ace(xs:anyURI('" + collectionUri + "'), '" + user_uid + "', " + (allow ? "true()" : "false()") + ", '" + mode + "')"); + executeQuery(uid, pwd, "sm:add-user-ace(xs:anyURI('" + collectionUri + "'), '" + user_uid + "', " + (allow ? "true()" : "false()") + ", '" + mode + "')").close(); } @Override protected String getXmlResourceContent(final String resourceUri, final String uid, final String pwd) throws ApiException { - final Sequence result = executeQuery(uid, pwd, "fn:doc('" + resourceUri + "')"); - return serialize(result); + try (final XQueryUtil.QueryResult queryResult = executeQuery(uid, pwd, "fn:doc('" + resourceUri + "')")) { + return serialize(queryResult.result); + } } @Override protected void removeAccount(final String account_uid, final String uid, final String pwd) throws ApiException { - executeQuery(uid, pwd, "if (sm:user-exists('" + account_uid + "')) then sm:remove-account('" + account_uid + "') else()"); + executeQuery(uid, pwd, "if (sm:user-exists('" + account_uid + "')) then sm:remove-account('" + account_uid + "') else()").close(); } @Override protected void removeGroup(final String group_gid, final String uid, final String pwd) throws ApiException { - executeQuery(uid, pwd, "if (sm:group-exists('" + group_gid + "')) then sm:remove-group('" + group_gid + "') else ()"); + executeQuery(uid, pwd, "if (sm:group-exists('" + group_gid + "')) then sm:remove-group('" + group_gid + "') else ()").close(); } @Override protected void createAccount(final String account_uid, final String account_pwd, final String group_uid, final String uid, final String pwd) throws ApiException { - executeQuery(uid, pwd, "sm:create-account('" + account_uid + "', '" + account_pwd + "', '" + group_uid + "', ())"); + executeQuery(uid, pwd, "sm:create-account('" + account_uid + "', '" + account_pwd + "', '" + group_uid + "', ())").close(); } @Override protected void createGroup(final String group_gid, final String uid, final String pwd) throws ApiException { - executeQuery(uid, pwd, "sm:create-group('" + group_gid + "')"); + executeQuery(uid, pwd, "sm:create-group('" + group_gid + "')").close(); } @Override @@ -137,7 +139,7 @@ protected void createXmlResource(final String resourceUri, final String content, final int resIdx = resourceUri.lastIndexOf('/'); final String collectionUri = resourceUri.substring(0, resIdx); final String resourceName = resourceUri.substring(resIdx + 1); - executeQuery(uid, pwd, "xmldb:store('" + collectionUri + "', '" + resourceName + "', fn:parse-xml('" + content + "'))"); + executeQuery(uid, pwd, "xmldb:store('" + collectionUri + "', '" + resourceName + "', fn:parse-xml('" + content + "'))").close(); } @Override @@ -146,16 +148,16 @@ protected void createBinResource(final String resourceUri, final byte[] content, final String collectionUri = resourceUri.substring(0, resIdx); final String resourceName = resourceUri.substring(resIdx + 1); final String base64Content = Base64.encodeBase64String(content); - executeQuery(uid, pwd, "xmldb:store-as-binary('" + collectionUri + "', '" + resourceName + "', xs:base64Binary('" + base64Content + "'))"); + executeQuery(uid, pwd, "xmldb:store-as-binary('" + collectionUri + "', '" + resourceName + "', xs:base64Binary('" + base64Content + "'))").close(); } - private Sequence executeQuery(final String uid, final String pwd, final String query) throws ApiException { + private XQueryUtil.QueryResult executeQuery(final String uid, final String pwd, final String query) throws ApiException { try { final BrokerPool pool = server.getBrokerPool(); final Subject user = pool.getSecurityManager().authenticate(uid, pwd); try (final DBBroker broker = pool.get(Optional.of(user))) { - return XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + return XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); } } catch (final AuthenticationException | EXistException | IOException | PermissionDeniedException | XPathException e) { throw new ApiException(e.getMessage(), e); diff --git a/exist-core/src/test/java/org/exist/storage/AbstractUpdateTest.java b/exist-core/src/test/java/org/exist/storage/AbstractUpdateTest.java index c51bb3522f..f1f340fe4f 100644 --- a/exist-core/src/test/java/org/exist/storage/AbstractUpdateTest.java +++ b/exist-core/src/test/java/org/exist/storage/AbstractUpdateTest.java @@ -130,9 +130,11 @@ private void read(final BrokerPool pool) throws EXistException, PermissionDenied } final String query = "/products/product[last()]"; - final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - for (final SequenceIterator i = seq.iterate(); i.hasNext(); ) { - Item next = i.nextItem(); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + for (final SequenceIterator i = seq.iterate(); i.hasNext(); ) { + final Item next = i.nextItem(); + } } } } diff --git a/exist-core/src/test/java/org/exist/storage/RangeIndexUpdateTest.java b/exist-core/src/test/java/org/exist/storage/RangeIndexUpdateTest.java index 4cf671ac2c..ff06a3b327 100644 --- a/exist-core/src/test/java/org/exist/storage/RangeIndexUpdateTest.java +++ b/exist-core/src/test/java/org/exist/storage/RangeIndexUpdateTest.java @@ -126,9 +126,11 @@ public void updates() throws EXistException, PermissionDeniedException, XPathExc checkIndex(broker, docs, ITEM_QNAME, new StringValue("Cabinet1525.00"), 1); final String query = "//item[. = 'Chair']"; - final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } final XUpdateProcessor proc = new XUpdateProcessor(broker, docs); assertNotNull(proc); diff --git a/exist-core/src/test/java/org/exist/storage/RecoveryTest.java b/exist-core/src/test/java/org/exist/storage/RecoveryTest.java index 2871f0558a..7cf8ed2bfb 100644 --- a/exist-core/src/test/java/org/exist/storage/RecoveryTest.java +++ b/exist-core/src/test/java/org/exist/storage/RecoveryTest.java @@ -210,11 +210,14 @@ private void verify(final BrokerPool pool) throws EXistException, PermissionDeni } final String query = "//SPEECH[contains(LINE, 'king')]"; - final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - for (final SequenceIterator i = seq.iterate(); i.hasNext(); ) { - final Item next = i.nextItem(); - final String value = serializer.serialize((NodeValue) next); + + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + for (final SequenceIterator i = seq.iterate(); i.hasNext(); ) { + final Item next = i.nextItem(); + final String value = serializer.serialize((NodeValue) next); + } } } finally { diff --git a/exist-core/src/test/java/org/exist/storage/ShutdownTest.java b/exist-core/src/test/java/org/exist/storage/ShutdownTest.java index 738b2b4937..066d95dbb1 100644 --- a/exist-core/src/test/java/org/exist/storage/ShutdownTest.java +++ b/exist-core/src/test/java/org/exist/storage/ShutdownTest.java @@ -104,9 +104,11 @@ public void storeAndShutdown() throws EXistException, PermissionDeniedException, } final String query = "//SPEECH[contains(LINE, 'love')]"; - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(result); - assertEquals(187, result.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; + assertNotNull(result); + assertEquals(187, result.getItemCount()); + } transact.commit(transaction); } diff --git a/exist-core/src/test/java/org/exist/xquery/AbsolutePathTests.java b/exist-core/src/test/java/org/exist/xquery/AbsolutePathTests.java index d551d2582c..35153293c7 100644 --- a/exist-core/src/test/java/org/exist/xquery/AbsolutePathTests.java +++ b/exist-core/src/test/java/org/exist/xquery/AbsolutePathTests.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -93,9 +117,13 @@ public void immediateLambdaWithDocumentAndDoubleSlash() throws EXistException, P "let $d := document { }\n" + "return\n" + " { $f($d) }"; - final Either actual = executeQuery(query); - assertXQResultIdentical(expected, actual); + final Either actual = executeQuery(query); + try { + assertXQResultIdentical(expected, actual); + } finally { + close(actual); + } } @Test @@ -106,9 +134,12 @@ public void immediateLambdaWithDocumentAndSlash() throws EXistException, Permiss "let $d := document { }\n" + "return\n" + " $f($d)"; - final Either actual = executeQuery(query); - - assertXQResultIdentical(expected, actual); + final Either actual = executeQuery(query); + try { + assertXQResultIdentical(expected, actual); + } finally { + close(actual); + } } @Test @@ -119,9 +150,12 @@ public void immediateLambdaWithDocumentAndLoneSlash() throws EXistException, Per "let $d := document { }\n" + "return\n" + " $f($d)"; - final Either actual = executeQuery(query); - - assertXQResultSimilar(expected, actual); + final Either actual = executeQuery(query); + try { + assertXQResultSimilar(expected, actual); + } finally { + close(actual); + } } @Test @@ -129,8 +163,11 @@ public void topLevelAbsolutePath() throws EXistException, PermissionDeniedExcept final Sequence expected = new IntegerValue(1); final String query = "count(//*)"; - final Either actual = executeQuery(query); - - assertThatXQResult(actual, equalTo(expected)); + final Either actual = executeQuery(query); + try { + assertThatXQResult(actual, equalTo(expected)); + } finally { + close(actual); + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/CleanupTest.java b/exist-core/src/test/java/org/exist/xquery/CleanupTest.java index 21bdc3cf8e..775341588f 100644 --- a/exist-core/src/test/java/org/exist/xquery/CleanupTest.java +++ b/exist-core/src/test/java/org/exist/xquery/CleanupTest.java @@ -166,9 +166,10 @@ public void resetStateOfModuleVars() throws XMLDBException, XPathException { @Test public void resetStateOfInlineFunc() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = BrokerPool.getInstance(); - try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(TEST_INLINE), false, Sequence.EMPTY_SEQUENCE, null, null, null, null)) { // execute query to get a function item - final Sequence result = XQueryUtil.query(broker, new StringSource(TEST_INLINE), false, Sequence.EMPTY_SEQUENCE, null, null, null, null).result; + final Sequence result = queryResult.result; assertEquals(result.getItemCount(), 1); final FunctionCall call = ((FunctionReference)result.itemAt(0)).getCall(); // closure variables are set when function item is created, but should be cleared after query diff --git a/exist-core/src/test/java/org/exist/xquery/ConstructedNodesRecoveryTest.java b/exist-core/src/test/java/org/exist/xquery/ConstructedNodesRecoveryTest.java index 237a77551c..35010d4b3b 100644 --- a/exist-core/src/test/java/org/exist/xquery/ConstructedNodesRecoveryTest.java +++ b/exist-core/src/test/java/org/exist/xquery/ConstructedNodesRecoveryTest.java @@ -261,13 +261,13 @@ private void constructedNodeQuery(boolean forceCorruption) throws EXistException //execute an xquery final Source source = new StringSource(query); - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + final Sequence result = queryResult.result; + assertEquals(expectedResults.length, result.getItemCount()); - final Sequence result = queryResult.result; - assertEquals(expectedResults.length, result.getItemCount()); - - for (int i = 0; i < result.getItemCount(); i++) { - assertEquals(expectedResults[i], (String)result.itemAt(i).getStringValue()); + for (int i = 0; i < result.getItemCount(); i++) { + assertEquals(expectedResults[i], result.itemAt(i).getStringValue()); + } } //read the first test document diff --git a/exist-core/src/test/java/org/exist/xquery/ForwardReferenceTest.java b/exist-core/src/test/java/org/exist/xquery/ForwardReferenceTest.java index f2118d9cf8..c9f2761322 100644 --- a/exist-core/src/test/java/org/exist/xquery/ForwardReferenceTest.java +++ b/exist-core/src/test/java/org/exist/xquery/ForwardReferenceTest.java @@ -173,17 +173,17 @@ public void test1() throws EXistException, PermissionDeniedException, IOExceptio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, testXquerySource, false, null, null, null, null, null); - - try (final StringBuilderWriter writer = new StringBuilderWriter()) { - final XQuerySerializer xquerySerializer = new XQuerySerializer(broker, new Properties(), writer); - xquerySerializer.serialize(queryResult.result); - assertNotNull(writer.toString()); - } catch (final SAXException e) { - throw new XPathException((Expression) null, e); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, testXquerySource, false, null, null, null, null, null)) { + try (final StringBuilderWriter writer = new StringBuilderWriter()) { + final XQuerySerializer xquerySerializer = new XQuerySerializer(broker, new Properties(), writer); + xquerySerializer.serialize(queryResult.result); + assertNotNull(writer.toString()); + } catch (final SAXException e) { + throw new XPathException((Expression) null, e); + } + + transaction.commit(); } - - transaction.commit(); } } } diff --git a/exist-core/src/test/java/org/exist/xquery/FunctionTypeInElementContentTest.java b/exist-core/src/test/java/org/exist/xquery/FunctionTypeInElementContentTest.java index 4dd4da8599..20ef79d750 100644 --- a/exist-core/src/test/java/org/exist/xquery/FunctionTypeInElementContentTest.java +++ b/exist-core/src/test/java/org/exist/xquery/FunctionTypeInElementContentTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -21,6 +45,7 @@ */ package org.exist.xquery; +import com.evolvedbinary.j8fu.Either; import org.exist.EXistException; import org.exist.security.PermissionDeniedException; import org.exist.test.XQueryCompilationTest; @@ -108,7 +133,12 @@ public void mapConstructorLookup() throws EXistException, PermissionDeniedExcept public void sequenceOfMaps() throws EXistException, PermissionDeniedException { final String query = "element test { (map {}) }"; final String error = "Function types are not allowed in element content. Got map(*)"; - assertXQDynamicError(ErrorCodes.XQTY0105, 1, 17, error, executeQuery(query)); + final Either actual = executeQuery(query); + try { + assertXQDynamicError(ErrorCodes.XQTY0105, 1, 17, error, actual); + } finally { + close(actual); + } } // TODO(JL): add (sub-expression) location diff --git a/exist-core/src/test/java/org/exist/xquery/ImportModuleTest.java b/exist-core/src/test/java/org/exist/xquery/ImportModuleTest.java index b6c2cb851a..c5f8d3390a 100644 --- a/exist-core/src/test/java/org/exist/xquery/ImportModuleTest.java +++ b/exist-core/src/test/java/org/exist/xquery/ImportModuleTest.java @@ -120,8 +120,8 @@ public void prefixXmlNs() throws SAXException, PermissionDeniedException, IOExce storeModules(broker, transaction,"/db", Tuple("impl1.xqm", module)); // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -175,8 +175,8 @@ public void prefixSameAsOtherImport() throws EXistException, IOException, SAXExc ); // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -219,8 +219,8 @@ public void prefixSameAsOtherNamespaceDeclaration() throws EXistException, IOExc storeModules(broker, transaction,"/db", Tuple("impl1.xqm", module)); // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -274,8 +274,8 @@ public void prefixSameAsModuleDeclaration() throws EXistException, IOException, ); // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -316,8 +316,8 @@ public void emptyNamespace() throws EXistException, IOException, PermissionDenie storeModules(broker, transaction,"/db", Tuple("impl1.xqm", module)); // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -373,8 +373,8 @@ public void namespaceSameAsOtherImport() throws EXistException, IOException, Per ); // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -405,8 +405,8 @@ public void noSuchModuleWithLocationHint() throws EXistException, IOException, P final Txn transaction = pool.getTransactionManager().beginTransaction()) { // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -437,8 +437,8 @@ public void noSuchModuleWithoutLocationHint() throws EXistException, IOException final Txn transaction = pool.getTransactionManager().beginTransaction()) { // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -491,8 +491,8 @@ public void functionSameAsOtherModule() throws EXistException, IOException, Perm ); // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -532,8 +532,8 @@ public void functionDuplicateInMainModule() throws EXistException, IOException, final Txn transaction = pool.getTransactionManager().beginTransaction()) { // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -576,8 +576,8 @@ public void functionDuplicateNsInMainModule() throws EXistException, IOException final Txn transaction = pool.getTransactionManager().beginTransaction()) { // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -625,8 +625,8 @@ public void functionSameAsImportingModule() throws EXistException, IOException, ); // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -675,8 +675,8 @@ public void variableSameAsOtherModule() throws EXistException, IOException, Perm ); // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -719,8 +719,8 @@ public void variableSameAsImportingModule() throws EXistException, IOException, ); // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -763,26 +763,26 @@ public void functionsSingleLocationHint() throws EXistException, IOException, Pe ); // execute query - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // check that the result was correct + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); + assertNotNull(doc); - // check that the result was correct - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - final Element doc = (Element) queryResult.result.itemAt(0); - assertNotNull(doc); + final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); + final javax.xml.transform.Source expected = Input.fromString("to impl1").build(); - final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); - final javax.xml.transform.Source expected = Input.fromString("to impl1").build(); + final Diff diff = DiffBuilder + .compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); - final Diff diff = DiffBuilder - .compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); + assertFalse(diff.toString(), diff.hasDifferences()); - assertFalse(diff.toString(), diff.hasDifferences()); - - transaction.commit(); + transaction.commit(); + } } } @@ -834,32 +834,32 @@ public void functionsCompositeFromMultipleLocationHints() throws EXistException, ); // execute query - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); - - // check that the result was correct - assertNotNull(queryResult); - assertEquals(1, queryResult.result.getItemCount()); - final Element doc = (Element)queryResult.result.itemAt(0); - assertNotNull(doc); - - final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); - final javax.xml.transform.Source expected = Input.fromString( - "" + - "to impl1" + - "to impl2" + - "to impl3" + - "" - ).build(); - - final Diff diff = DiffBuilder - .compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); - - assertFalse(diff.toString(), diff.hasDifferences()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // check that the result was correct + assertNotNull(queryResult); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element)queryResult.result.itemAt(0); + assertNotNull(doc); + + final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); + final javax.xml.transform.Source expected = Input.fromString( + "" + + "to impl1" + + "to impl2" + + "to impl3" + + "" + ).build(); + + final Diff diff = DiffBuilder + .compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); + + assertFalse(diff.toString(), diff.hasDifferences()); - transaction.commit(); + transaction.commit(); + } } } @@ -911,32 +911,32 @@ public void functionsCompositeFromMultipleLocationHintsWithDifferingPrefixes() t ); // execute query - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); - - // check that the result was correct - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - final Element doc = (Element)queryResult.result.itemAt(0); - assertNotNull(doc); - - final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); - final javax.xml.transform.Source expected = Input.fromString( - "" + - "to impl1" + - "to impl2" + - "to impl3" + - "" - ).build(); - - final Diff diff = DiffBuilder - .compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); - - assertFalse(diff.toString(), diff.hasDifferences()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // check that the result was correct + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element)queryResult.result.itemAt(0); + assertNotNull(doc); + + final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); + final javax.xml.transform.Source expected = Input.fromString( + "" + + "to impl1" + + "to impl2" + + "to impl3" + + "" + ).build(); + + final Diff diff = DiffBuilder + .compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); + + assertFalse(diff.toString(), diff.hasDifferences()); - transaction.commit(); + transaction.commit(); + } } } @@ -967,26 +967,26 @@ public void variablesSingleLocationHint() throws EXistException, IOException, Pe ); // execute query - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); - - // check that the result was correct - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - final Element doc = (Element) queryResult.result.itemAt(0); - assertNotNull(doc); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // check that the result was correct + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); + assertNotNull(doc); - final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); - final javax.xml.transform.Source expected = Input.fromString("impl1").build(); + final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); + final javax.xml.transform.Source expected = Input.fromString("impl1").build(); - final Diff diff = DiffBuilder - .compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); + final Diff diff = DiffBuilder + .compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + assertFalse(diff.toString(), diff.hasDifferences()); - transaction.commit(); + transaction.commit(); + } } } @@ -1032,32 +1032,32 @@ public void variablesCompositeFromMultipleLocationHints() throws EXistException, ); // execute query - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); - - // check that the result was correct - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - final Element doc = (Element) queryResult.result.itemAt(0); - assertNotNull(doc); - - final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); - final javax.xml.transform.Source expected = Input.fromString( - "" + - "impl1" + - "impl2" + - "impl3" + - "" - ).build(); - - final Diff diff = DiffBuilder - .compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); - - assertFalse(diff.toString(), diff.hasDifferences()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // check that the result was correct + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); + assertNotNull(doc); + + final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); + final javax.xml.transform.Source expected = Input.fromString( + "" + + "impl1" + + "impl2" + + "impl3" + + "" + ).build(); + + final Diff diff = DiffBuilder + .compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); + + assertFalse(diff.toString(), diff.hasDifferences()); - transaction.commit(); + transaction.commit(); + } } } @@ -1103,32 +1103,32 @@ public void variablesCompositeFromMultipleLocationHintsWithDifferingPrefixes() t ); // execute query - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); - - // check that the result was correct - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - final Element doc = (Element) queryResult.result.itemAt(0); - assertNotNull(doc); - - final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); - final javax.xml.transform.Source expected = Input.fromString( - "" + - "impl1" + - "impl2" + - "impl3" + - "" - ).build(); - - final Diff diff = DiffBuilder - .compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); - - assertFalse(diff.toString(), diff.hasDifferences()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // check that the result was correct + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); + assertNotNull(doc); + + final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); + final javax.xml.transform.Source expected = Input.fromString( + "" + + "impl1" + + "impl2" + + "impl3" + + "" + ).build(); + + final Diff diff = DiffBuilder + .compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); + + assertFalse(diff.toString(), diff.hasDifferences()); - transaction.commit(); + transaction.commit(); + } } } @@ -1176,36 +1176,36 @@ public void variablesBetweenModules() throws EXistException, PermissionDeniedExc ); // execute query - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); - - // check that the result was correct - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - final Element doc = (Element) queryResult.result.itemAt(0); - assertNotNull(doc); - - final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); - final javax.xml.transform.Source expected = Input.fromString( - "" + - "" + - "mod2 var1" + - "" + + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // check that the result was correct + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); + assertNotNull(doc); + + final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); + final javax.xml.transform.Source expected = Input.fromString( + "" + + "" + + "mod2 var1" + + "" + + "mod1 var1" + + "" + "mod1 var1" + - "" + - "mod1 var1" + - "" + - "" - ).build(); + "" + + "" + ).build(); - final Diff diff = DiffBuilder - .compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); + final Diff diff = DiffBuilder + .compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + assertFalse(diff.toString(), diff.hasDifferences()); - transaction.commit(); + transaction.commit(); + } } } @@ -1255,8 +1255,8 @@ public void xq10CyclicTwoLibraryModules() throws EXistException, IOException, Pe ); // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -1316,30 +1316,30 @@ public void xq31CyclicTwoLibraryModules() throws EXistException, IOException, Pe ); // execute query - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); - - // check that the result was correct - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - final Element doc = (Element) queryResult.result.itemAt(0); - assertNotNull(doc); - - final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); - final javax.xml.transform.Source expected = Input.fromString( - "" + - "from main" + - "" - ).build(); - - final Diff diff = DiffBuilder - .compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); - - assertFalse(diff.toString(), diff.hasDifferences()); - - transaction.commit(); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // check that the result was correct + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); + assertNotNull(doc); + + final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); + final javax.xml.transform.Source expected = Input.fromString( + "" + + "from main" + + "" + ).build(); + + final Diff diff = DiffBuilder + .compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); + + assertFalse(diff.toString(), diff.hasDifferences()); + + transaction.commit(); + } } } @@ -1399,8 +1399,8 @@ public void xq10CyclicThreeLibraryModules() throws EXistException, IOException, ); // execute query - try { - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // result not being used, just checking for errors transaction.commit(); @@ -1470,30 +1470,30 @@ public void xq31CyclicThreeLibraryModules() throws EXistException, IOException, ); // execute query - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); - - // check that the result was correct - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - final Element doc = (Element) queryResult.result.itemAt(0); - assertNotNull(doc); - - final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); - final javax.xml.transform.Source expected = Input.fromString( - "" + - "from main" + - "" - ).build(); - - final Diff diff = DiffBuilder - .compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); - - assertFalse(diff.toString(), diff.hasDifferences()); - - transaction.commit(); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // check that the result was correct + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Element doc = (Element) queryResult.result.itemAt(0); + assertNotNull(doc); + + final javax.xml.transform.Source actual = Input.fromDocument(doc.getOwnerDocument()).build(); + final javax.xml.transform.Source expected = Input.fromString( + "" + + "from main" + + "" + ).build(); + + final Diff diff = DiffBuilder + .compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); + + assertFalse(diff.toString(), diff.hasDifferences()); + + transaction.commit(); + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/JavaBindingTest.java b/exist-core/src/test/java/org/exist/xquery/JavaBindingTest.java index d0adc8c789..a66af5d2c1 100644 --- a/exist-core/src/test/java/org/exist/xquery/JavaBindingTest.java +++ b/exist-core/src/test/java/org/exist/xquery/JavaBindingTest.java @@ -83,12 +83,13 @@ public void callStaticMethod() throws EXistException, XPathException, Permission try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.DOUBLE, item.getType()); - assertEquals(-0.058374143427580086, item.toJavaObject(double.class), 0); + assertEquals(Type.DOUBLE, item.getType()); + assertEquals(-0.058374143427580086, item.toJavaObject(double.class), 0); + } transaction.commit(); } @@ -106,12 +107,13 @@ public void functionAvailableStaticMethod() throws EXistException, XPathExceptio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, item.getType()); - assertTrue(item.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); + } transaction.commit(); } @@ -129,12 +131,13 @@ public void functionAvailableStaticMethodVarArgs0() throws EXistException, XPath try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, item.getType()); - assertFalse(item.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertFalse(item.toJavaObject(boolean.class)); + } transaction.commit(); } @@ -151,12 +154,13 @@ public void callStaticMethodVarArgs1() throws EXistException, XPathException, Pe try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, item.getType()); - assertEquals("a", item.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a", item.toJavaObject(String.class)); + } transaction.commit(); } @@ -174,12 +178,13 @@ public void functionAvailableStaticMethodVarArgs1() throws EXistException, XPath try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, item.getType()); - assertTrue(item.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); + } transaction.commit(); } @@ -196,12 +201,13 @@ public void callStaticMethodVarArgs1Sequence() throws EXistException, XPathExcep try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, item.getType()); - assertEquals("a", item.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a", item.toJavaObject(String.class)); + } transaction.commit(); } @@ -218,12 +224,13 @@ public void callStaticMethodVarArgs1Array() throws EXistException, XPathExceptio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, item.getType()); - assertEquals("a", item.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a", item.toJavaObject(String.class)); + } transaction.commit(); } @@ -240,12 +247,13 @@ public void callStaticMethodVarArgs2() throws EXistException, XPathException, Pe try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, item.getType()); - assertEquals("a,b", item.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a,b", item.toJavaObject(String.class)); + } transaction.commit(); } @@ -262,12 +270,13 @@ public void callStaticMethodVarArgs2Sequence() throws EXistException, XPathExcep try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, item.getType()); - assertEquals("a,b", item.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a,b", item.toJavaObject(String.class)); + } transaction.commit(); } @@ -284,12 +293,13 @@ public void callStaticMethodVarArgs2Array() throws EXistException, XPathExceptio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, item.getType()); - assertEquals("a,b", item.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a,b", item.toJavaObject(String.class)); + } transaction.commit(); } @@ -307,12 +317,13 @@ public void functionAvailableStaticMethodVarArgs2() throws EXistException, XPath try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, item.getType()); - assertTrue(item.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); + } transaction.commit(); } @@ -329,12 +340,13 @@ public void callStaticMethodVarArgs3() throws EXistException, XPathException, Pe try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, item.getType()); - assertEquals("a,b,c", item.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a,b,c", item.toJavaObject(String.class)); + } transaction.commit(); } @@ -351,12 +363,13 @@ public void callStaticMethodVarArgs3Sequence() throws EXistException, XPathExcep try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, item.getType()); - assertEquals("a,b,c", item.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a,b,c", item.toJavaObject(String.class)); + } transaction.commit(); } @@ -373,12 +386,13 @@ public void callStaticMethodVarArgs3Array() throws EXistException, XPathExceptio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, item.getType()); - assertEquals("a,b,c", item.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("a,b,c", item.toJavaObject(String.class)); + } transaction.commit(); } @@ -396,12 +410,13 @@ public void functionAvailableStaticMethodVarArgs3() throws EXistException, XPath try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, item.getType()); - assertTrue(item.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); + } transaction.commit(); } @@ -418,12 +433,13 @@ public void callStaticMethodArrayParam() throws EXistException, XPathException, try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.ARRAY_ITEM, item.getType()); - assertArrayEquals(new String[] {"a", "b"}, item.toJavaObject(String[].class)); + assertEquals(Type.ARRAY_ITEM, item.getType()); + assertArrayEquals(new String[] {"a", "b"}, item.toJavaObject(String[].class)); + } transaction.commit(); } @@ -442,12 +458,13 @@ public void callStaticMethodArrayParamVarRefExplicitType() throws EXistException try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.ARRAY_ITEM, item.getType()); - assertArrayEquals(new String[] {"a", "b"}, item.toJavaObject(String[].class)); + assertEquals(Type.ARRAY_ITEM, item.getType()); + assertArrayEquals(new String[] {"a", "b"}, item.toJavaObject(String[].class)); + } transaction.commit(); } @@ -466,12 +483,13 @@ public void callStaticMethodArrayParamVarRefImplicitType() throws EXistException try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.ARRAY_ITEM, item.getType()); - assertArrayEquals(new String[] {"a", "b"}, item.toJavaObject(String[].class)); + assertEquals(Type.ARRAY_ITEM, item.getType()); + assertArrayEquals(new String[] {"a", "b"}, item.toJavaObject(String[].class)); + } transaction.commit(); } @@ -488,12 +506,13 @@ public void callStaticMethodMapParam() throws EXistException, XPathException, Pe try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.MAP_ITEM, item.getType()); - assertEquals(hashMap(Tuple("a", BigInteger.valueOf(1)), Tuple("b", BigInteger.valueOf(2)), Tuple("c", BigInteger.valueOf(3))), item.toJavaObject(Map.class)); + assertEquals(Type.MAP_ITEM, item.getType()); + assertEquals(hashMap(Tuple("a", BigInteger.valueOf(1)), Tuple("b", BigInteger.valueOf(2)), Tuple("c", BigInteger.valueOf(3))), item.toJavaObject(Map.class)); + } transaction.commit(); } @@ -512,12 +531,13 @@ public void callStaticMethodMapParamVarRefExplicitType() throws EXistException, try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.MAP_ITEM, item.getType()); - assertEquals(hashMap(Tuple("a", BigInteger.valueOf(1)), Tuple("b", BigInteger.valueOf(2)), Tuple("c", BigInteger.valueOf(3))), item.toJavaObject(Map.class)); + assertEquals(Type.MAP_ITEM, item.getType()); + assertEquals(hashMap(Tuple("a", BigInteger.valueOf(1)), Tuple("b", BigInteger.valueOf(2)), Tuple("c", BigInteger.valueOf(3))), item.toJavaObject(Map.class)); + } transaction.commit(); } @@ -536,12 +556,13 @@ public void callStaticMethodMapParamVarRefImplicitType() throws EXistException, try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.MAP_ITEM, item.getType()); - assertEquals(hashMap(Tuple("a", BigInteger.valueOf(1)), Tuple("b", BigInteger.valueOf(2)), Tuple("c", BigInteger.valueOf(3))), item.toJavaObject(Map.class)); + assertEquals(Type.MAP_ITEM, item.getType()); + assertEquals(hashMap(Tuple("a", BigInteger.valueOf(1)), Tuple("b", BigInteger.valueOf(2)), Tuple("c", BigInteger.valueOf(3))), item.toJavaObject(Map.class)); + } transaction.commit(); } @@ -559,12 +580,13 @@ public void functionAvailableStaticMethodArrayParam() throws EXistException, XPa try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, item.getType()); - assertTrue(item.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); + } transaction.commit(); } @@ -583,12 +605,13 @@ public void callInstanceMethodReturnArray() throws EXistException, XPathExceptio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.ARRAY_ITEM, item.getType()); - assertArrayEquals(new byte[] { 'h', 'e', 'l', 'l', 'o' }, item.toJavaObject(byte[].class)); + assertEquals(Type.ARRAY_ITEM, item.getType()); + assertArrayEquals(new byte[] { 'h', 'e', 'l', 'l', 'o' }, item.toJavaObject(byte[].class)); + } transaction.commit(); } @@ -606,12 +629,13 @@ public void functionAvailableInstanceMethodReturnArray() throws EXistException, try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, item.getType()); - assertTrue(item.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); + } transaction.commit(); } @@ -628,12 +652,13 @@ public void callStaticMethodFloat() throws EXistException, XPathException, Permi try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.FLOAT, item.getType()); - assertEquals(1.7000002f, item.toJavaObject(float.class), 0); + assertEquals(Type.FLOAT, item.getType()); + assertEquals(1.7000002f, item.toJavaObject(float.class), 0); + } transaction.commit(); } @@ -650,12 +675,13 @@ public void callStaticMethodDouble() throws EXistException, XPathException, Perm try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.DOUBLE, item.getType()); - assertEquals(1.7000000000000002d, item.toJavaObject(double.class), 0); + assertEquals(Type.DOUBLE, item.getType()); + assertEquals(1.7000000000000002d, item.toJavaObject(double.class), 0); + } transaction.commit(); } @@ -672,12 +698,13 @@ public void callStaticField() throws EXistException, XPathException, PermissionD try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.DOUBLE, item.getType()); - assertEquals(3.14159265358979323846, item.toJavaObject(double.class), 0); + assertEquals(Type.DOUBLE, item.getType()); + assertEquals(3.14159265358979323846, item.toJavaObject(double.class), 0); + } transaction.commit(); } @@ -696,12 +723,13 @@ public void callInstanceField() throws EXistException, XPathException, Permissio try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, item.getType()); - assertTrue(item.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); + } transaction.commit(); } @@ -719,12 +747,13 @@ public void functionAvailableStaticField() throws EXistException, XPathException try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, item.getType()); - assertTrue(item.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); + } transaction.commit(); } @@ -741,12 +770,13 @@ public void callStringConstructor() throws EXistException, XPathException, Permi try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, item.getType()); - assertEquals("hello world", item.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("hello world", item.toJavaObject(String.class)); + } transaction.commit(); } @@ -763,12 +793,13 @@ public void callListConstructor() throws EXistException, XPathException, Permiss try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.JAVA_OBJECT, item.getType()); - assertEquals(new ArrayList<>(), item.toJavaObject(List.class)); + assertEquals(Type.JAVA_OBJECT, item.getType()); + assertEquals(new ArrayList<>(), item.toJavaObject(List.class)); + } transaction.commit(); } @@ -786,12 +817,13 @@ public void functionAvailableInstanceMethod() throws EXistException, XPathExcept try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, item.getType()); - assertTrue(item.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); + } transaction.commit(); } @@ -810,12 +842,13 @@ public void callInstanceMethod() throws EXistException, XPathException, Permissi try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, item.getType()); - assertEquals("hello world everyone", item.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("hello world everyone", item.toJavaObject(String.class)); + } transaction.commit(); } @@ -833,12 +866,13 @@ public void functionAvailableConstructor() throws EXistException, XPathException try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.BOOLEAN, item.getType()); - assertTrue(item.toJavaObject(boolean.class)); + assertEquals(Type.BOOLEAN, item.getType()); + assertTrue(item.toJavaObject(boolean.class)); + } transaction.commit(); } @@ -858,12 +892,13 @@ public void callVoidMethodReturnThis() throws EXistException, XPathException, Pe try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.INTEGER, item.getType()); - assertEquals(7, (int) item.toJavaObject(int.class)); + assertEquals(Type.INTEGER, item.getType()); + assertEquals(7, (int) item.toJavaObject(int.class)); + } transaction.commit(); } @@ -883,12 +918,13 @@ public void buildJavaList() throws EXistException, XPathException, PermissionDen try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, item.getType()); - assertEquals("cherries.apples.bananas", item.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("cherries.apples.bananas", item.toJavaObject(String.class)); + } transaction.commit(); } @@ -910,12 +946,13 @@ public void buildJavaListWithVoidReturnThis() throws EXistException, XPathExcept try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject())); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null); - Assertions.assertTrue(queryResult.result.hasOne()); - final Item item = queryResult.result.itemAt(0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, query, false, null, null, null, null, null)) { + Assertions.assertTrue(queryResult.result.hasOne()); + final Item item = queryResult.result.itemAt(0); - assertEquals(Type.STRING, item.getType()); - assertEquals("cherries", item.toJavaObject(String.class)); + assertEquals(Type.STRING, item.getType()); + assertEquals("cherries", item.toJavaObject(String.class)); + } transaction.commit(); } diff --git a/exist-core/src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java b/exist-core/src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java index c4f14cfb35..00d1d3d4b9 100644 --- a/exist-core/src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XQueryDeclareContextItemTest.java @@ -136,8 +136,9 @@ public void declareContextItem() throws EXistException, PermissionDeniedExceptio ". + 4"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.getBroker()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final DBBroker broker = pool.getBroker(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; assertEquals(1, result.getItemCount()); assertEquals(7, (int)result.itemAt(0).toJavaObject(int.class)); } @@ -154,8 +155,9 @@ public void declareContextItemIsDocument() throws EXistException, PermissionDeni "(/) instance of document-node()"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.getBroker()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final DBBroker broker = pool.getBroker(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; assertEquals(1, result.getItemCount()); assertEquals(true, result.effectiveBooleanValue()); } @@ -169,8 +171,9 @@ public void declareContextItemTyped() throws EXistException, PermissionDeniedExc ". + 4"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.getBroker()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final DBBroker broker = pool.getBroker(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; assertEquals(1, result.getItemCount()); assertEquals(7, (int)result.itemAt(0).toJavaObject(int.class)); } @@ -184,8 +187,9 @@ public void declareContextItemExternal() throws EXistException, PermissionDenied ". + 4"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.getBroker()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, new IntegerValue(3), null, null, null, null).result; + try (final DBBroker broker = pool.getBroker(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, new IntegerValue(3), null, null, null, null)) { + final Sequence result = queryResult.result; assertEquals(1, result.getItemCount()); assertEquals(7, (int)result.itemAt(0).toJavaObject(int.class)); } @@ -199,8 +203,9 @@ public void declareContextItemExternalDefault() throws EXistException, Permissio ". + 4"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.getBroker()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final DBBroker broker = pool.getBroker(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; assertEquals(1, result.getItemCount()); assertEquals(7, (int)result.itemAt(0).toJavaObject(int.class)); } @@ -214,8 +219,9 @@ public void declareContextItemExternalDefaultOverrides() throws EXistException, ". + 4"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.getBroker()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, new IntegerValue(20), null, null, null, null).result; + try (final DBBroker broker = pool.getBroker(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, new IntegerValue(20), null, null, null, null)) { + final Sequence result = queryResult.result; assertEquals(1, result.getItemCount()); assertEquals(24, (int)result.itemAt(0).toJavaObject(int.class)); } @@ -239,9 +245,11 @@ public void declareContextItemExternalElement() throws EXistException, Permissio final ElementImpl elem = (ElementImpl)builder.getDocument().getDocumentElement(); - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, elem, null, null, null, null).result; - assertEquals(1, result.getItemCount()); - assertEquals("", serialize(broker, (NodeValue)result.itemAt(0))); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, elem, null, null, null, null)) { + final Sequence result = queryResult.result; + assertEquals(1, result.getItemCount()); + assertEquals("", serialize(broker, (NodeValue) result.itemAt(0))); + } } } @@ -254,8 +262,9 @@ public void contextItemExternalDefaultElement() throws EXistException, SAXExcept "{.}"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.getBroker()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final DBBroker broker = pool.getBroker(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; assertEquals(1, result.getItemCount()); assertEquals("some-event", serialize(broker, (NodeValue)result.itemAt(0))); } diff --git a/exist-core/src/test/java/org/exist/xquery/XQueryTest.java b/exist-core/src/test/java/org/exist/xquery/XQueryTest.java index 697a72fc79..91415d7bfb 100644 --- a/exist-core/src/test/java/org/exist/xquery/XQueryTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XQueryTest.java @@ -1148,19 +1148,20 @@ public void importExternalClasspathMainModule() throws EXistException, IOExcepti } }; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, setupXqueryContextPreCompilation, null, null); - - assertEquals(1, queryResult.result.getItemCount()); - final Item item = queryResult.result.itemAt(0); - assertTrue(Type.subTypeOf(item.getType(), Type.NODE)); - - final Source expected = Input.fromString("" + timestamp + "").build(); - final Source actual = Input.fromNode((Node)item).build(); - final Diff diff = DiffBuilder.compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, setupXqueryContextPreCompilation, null, null)) { + + assertEquals(1, queryResult.result.getItemCount()); + final Item item = queryResult.result.itemAt(0); + assertTrue(Type.subTypeOf(item.getType(), Type.NODE)); + + final Source expected = Input.fromString("" + timestamp + "").build(); + final Source actual = Input.fromNode((Node) item).build(); + final Diff diff = DiffBuilder.compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); + assertFalse(diff.toString(), diff.hasDifferences()); + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/XQueryUpdateTest.java b/exist-core/src/test/java/org/exist/xquery/XQueryUpdateTest.java index d01cf77d4a..e63bffe8ed 100644 --- a/exist-core/src/test/java/org/exist/xquery/XQueryUpdateTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XQueryUpdateTest.java @@ -106,23 +106,29 @@ public void append() throws EXistException, PermissionDeniedException, XPathExce } query = "/products"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(seq.getItemCount(), 1); - - final Serializer serializer = broker.borrowSerializer(); - try { - serializer.serialize((NodeValue) seq.itemAt(0)); - } finally { - broker.returnSerializer(serializer); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(seq.getItemCount(), 1); + + final Serializer serializer = broker.borrowSerializer(); + try { + serializer.serialize((NodeValue) seq.itemAt(0)); + } finally { + broker.returnSerializer(serializer); + } } query = "//product"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); + } query = "//product[price > 0.0]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); + } } } @@ -147,34 +153,48 @@ public void appendAttributes() throws EXistException, PermissionDeniedException, } query = "/products"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(seq.getItemCount(), 1); - - final Serializer serializer = broker.borrowSerializer(); - try { - serializer.serialize((NodeValue) seq.itemAt(0)); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(seq.getItemCount(), 1); + + final Serializer serializer = broker.borrowSerializer(); + try { + serializer.serialize((NodeValue) seq.itemAt(0)); + } finally { + broker.returnSerializer(serializer); + } + } - query = "//product"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + query = "//product"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); + } - query = "//product[@name = 'n20']"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + query = "//product[@name = 'n20']"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; assertEquals(1, seq.getItemCount()); + } - store(broker, "attribs.xml", "ccc"); - query = "update insert attribute attr1 { 'eee' } into /test"; + store(broker, "attribs.xml", "ccc"); + query = "update insert attribute attr1 { 'eee' } into /test"; - //testing duplicate attribute ... - XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + //testing duplicate attribute ... + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + // no result access needed + } - query = "doc('" + TEST_COLLECTION + "/attribs.xml')/test[@attr1 = 'eee']"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + query = "doc('" + TEST_COLLECTION + "/attribs.xml')/test[@attr1 = 'eee']"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; assertEquals(1, seq.getItemCount()); - serializer.serialize((NodeValue) seq.itemAt(0)); - - } finally { - broker.returnSerializer(serializer); + final Serializer serializer = broker.borrowSerializer(); + try { + serializer.serialize((NodeValue) seq.itemAt(0)); + } finally { + broker.returnSerializer(serializer); + } } } } @@ -193,11 +213,15 @@ public void insertBefore() throws EXistException, PermissionDeniedException, XPa " \n" + " into /products"; - XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + // no result access needed + } query = "//product"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(1, seq.getItemCount()); + } query = " declare variable $i external;\n" + @@ -216,23 +240,29 @@ public void insertBefore() throws EXistException, PermissionDeniedException, XPa } query = "/products"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(seq.getItemCount(), 1); - - final Serializer serializer = broker.borrowSerializer(); - try { - serializer.serialize((NodeValue) seq.itemAt(0)); - } finally { - broker.returnSerializer(serializer); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(seq.getItemCount(), 1); + + final Serializer serializer = broker.borrowSerializer(); + try { + serializer.serialize((NodeValue) seq.itemAt(0)); + } finally { + broker.returnSerializer(serializer); + } } query = "//product"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(ITEMS_TO_APPEND + 1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(ITEMS_TO_APPEND + 1, seq.getItemCount()); + } query = "//product[price > 0.0]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); + } } } @@ -250,11 +280,15 @@ public void insertAfter() throws EXistException, PermissionDeniedException, XPat " \n" + " into /products"; - XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + // no result access needed + } query = "//product"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(1, seq.getItemCount()); + } query = " declare variable $i external;\n" + @@ -273,23 +307,29 @@ public void insertAfter() throws EXistException, PermissionDeniedException, XPat } query = "/products"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(seq.getItemCount(), 1); - - final Serializer serializer = broker.borrowSerializer(); - try { - serializer.serialize((NodeValue) seq.itemAt(0)); - } finally { - broker.returnSerializer(serializer); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(seq.getItemCount(), 1); + + final Serializer serializer = broker.borrowSerializer(); + try { + serializer.serialize((NodeValue) seq.itemAt(0)); + } finally { + broker.returnSerializer(serializer); + } } query = "//product"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(ITEMS_TO_APPEND + 1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(ITEMS_TO_APPEND + 1, seq.getItemCount()); + } query = "//product[price > 0.0]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); + } } } @@ -306,48 +346,68 @@ public void update() throws EXistException, PermissionDeniedException, XPathExce "for $prod at $i in //product return\n" + " update value $prod/description\n" + " with 'Updated Description ' || $i"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + // no result access needed + } query = "count(//product[starts-with(description, 'Updated')])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(ITEMS_TO_APPEND, (int)seq.itemAt(0).toJavaObject(int.class)); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(ITEMS_TO_APPEND, (int)seq.itemAt(0).toJavaObject(int.class)); + } for (int i = 1; i <= ITEMS_TO_APPEND; i++) { query = "//product[description eq 'Updated Description " + i + "']"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(1, seq.getItemCount()); + } } query = "//product[stock cast as xs:double gt 400]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(459, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(459, seq.getItemCount()); + } query = "//product[starts-with(stock, '401')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(1, seq.getItemCount()); + } query = "/products"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(1, seq.getItemCount()); + } query = "//product[@num cast as xs:integer eq 3]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(1, seq.getItemCount()); + } query = "/products"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(1, seq.getItemCount()); + } query = "declare option exist:output-size-limit '-1';\n" + "for $prod in //product return\n" + " update value $prod/stock\n" + " with (10,1)"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + // no result access needed + } query = "//product/stock/external[. cast as xs:integer eq 1]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); + } } } @@ -362,11 +422,15 @@ public void remove() throws EXistException, PermissionDeniedException, XPathExce String query = "for $prod in //product return\n" + " update delete $prod\n"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + // no result access needed + } query = "//product"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(seq.getItemCount(), 0); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(seq.getItemCount(), 0); + } } } @@ -382,20 +446,28 @@ public void rename() throws EXistException, PermissionDeniedException, XPathExce String query = "for $prod in //product return\n" + " update rename $prod/description as 'desc'\n"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + // no result access needed + } query = "//product/desc"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); + } query = "for $prod in //product return\n" + " update rename $prod/@num as 'count'\n"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + // no result access needed + } query = "//product/@count"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); + } } } @@ -411,29 +483,41 @@ public void replace() throws EXistException, PermissionDeniedException, XPathExc String query = "for $prod in //product return\n" + " update replace $prod/description with An updated description.\n"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + // no result access needed + } query = "//product/desc"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); + } query = "for $prod in //product return\n" + " update replace $prod/@num with '1'\n"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + // no result access needed + } query = "//product/@num"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); + } query = "for $prod in //product return\n" + " update replace $prod/desc/text() with 'A new update'\n"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + // no result access needed + } query = "//product[starts-with(desc, 'A new')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(seq.getItemCount(), ITEMS_TO_APPEND); + } } } @@ -452,7 +536,9 @@ public void attrUpdate() throws EXistException, LockException, SAXException, Per " xs:int(/progress/@done)\n" + ")"; - XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + // no result access needed + } } } @@ -473,19 +559,23 @@ public void appendCDATA() throws EXistException, PermissionDeniedException, XPat } query = "/products"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(seq.getItemCount(), 1); - - final Serializer serializer = broker.borrowSerializer(); - try { - serializer.serialize((NodeValue) seq.itemAt(0)); - } finally { - broker.returnSerializer(serializer); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(seq.getItemCount(), 1); + + final Serializer serializer = broker.borrowSerializer(); + try { + serializer.serialize((NodeValue) seq.itemAt(0)); + } finally { + broker.returnSerializer(serializer); + } } query = "//product"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertEquals(ITEMS_TO_APPEND, seq.getItemCount()); + } } } @@ -500,12 +590,15 @@ public void insertAttrib() throws EXistException, PermissionDeniedException, XPa "let $attrib := /@* "+ "return update insert $attrib into $node"; - XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + // no result access needed + } query = "doc('/db/insertAttribDoc.xml')/element()[@f eq 'ATTRIB VALUE']"; - Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - - assertFalse(result.isEmpty()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; + assertFalse(result.isEmpty()); + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/CollectionTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/CollectionTest.java index 85091889d6..ab16370025 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/CollectionTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/CollectionTest.java @@ -106,22 +106,23 @@ public void doc_dynamicallyAvailableCollection_absoluteUri() throws XPathExcepti xqueryContext.addDynamicallyAvailableCollection(collectionUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); }; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); - final Sequence result = queryResult.result; - - assertFalse(result.isEmpty()); - assertEquals(1, result.getItemCount()); - assertTrue(result.itemAt(0) instanceof Node); - - final Source expectedSource = Input.fromString(doc).build(); - final Source actualSource = Input.fromNode((Node)result.itemAt(0)).build(); - final Diff diff = DiffBuilder.compare(expectedSource) - .withTest(actualSource) - .checkForIdentical() - .checkForSimilar() - .build(); - - assertFalse(diff.toString(), diff.hasDifferences()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null)) { + final Sequence result = queryResult.result; + + assertFalse(result.isEmpty()); + assertEquals(1, result.getItemCount()); + assertTrue(result.itemAt(0) instanceof Node); + + final Source expectedSource = Input.fromString(doc).build(); + final Source actualSource = Input.fromNode((Node) result.itemAt(0)).build(); + final Diff diff = DiffBuilder.compare(expectedSource) + .withTest(actualSource) + .checkForIdentical() + .checkForSimilar() + .build(); + + assertFalse(diff.toString(), diff.hasDifferences()); + } } } @@ -144,22 +145,23 @@ public void doc_dynamicallyAvailableCollection_relativeUri() throws XPathExcepti xqueryContext.addDynamicallyAvailableCollection(baseUri + collectionRelativeUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); }; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); - final Sequence result = queryResult.result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null)) { + final Sequence result = queryResult.result; - assertFalse(result.isEmpty()); - assertEquals(1, result.getItemCount()); - assertTrue(result.itemAt(0) instanceof Node); + assertFalse(result.isEmpty()); + assertEquals(1, result.getItemCount()); + assertTrue(result.itemAt(0) instanceof Node); - final Source expectedSource = Input.fromString(doc).build(); - final Source actualSource = Input.fromNode((Node)result.itemAt(0)).build(); - final Diff diff = DiffBuilder.compare(expectedSource) - .withTest(actualSource) - .checkForIdentical() - .checkForSimilar() - .build(); + final Source expectedSource = Input.fromString(doc).build(); + final Source actualSource = Input.fromNode((Node) result.itemAt(0)).build(); + final Diff diff = DiffBuilder.compare(expectedSource) + .withTest(actualSource) + .checkForIdentical() + .checkForSimilar() + .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + assertFalse(diff.toString(), diff.hasDifferences()); + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/DocTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/DocTest.java index cf0eb1a95c..eb530dab99 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/DocTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/DocTest.java @@ -192,22 +192,23 @@ public void doc_dynamicallyAvailableDocument_absoluteUri() throws XPathException xqueryContext.addDynamicallyAvailableDocument(docUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); }; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); - final Sequence result = queryResult.result; - - assertFalse(result.isEmpty()); - assertEquals(1, result.getItemCount()); - assertTrue(result.itemAt(0) instanceof Node); - - final Source expectedSource = Input.fromString(doc).build(); - final Source actualSource = Input.fromNode((Node)result.itemAt(0)).build(); - final Diff diff = DiffBuilder.compare(expectedSource) - .withTest(actualSource) - .checkForIdentical() - .checkForSimilar() - .build(); - - assertFalse(diff.toString(), diff.hasDifferences()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null)) { + final Sequence result = queryResult.result; + + assertFalse(result.isEmpty()); + assertEquals(1, result.getItemCount()); + assertTrue(result.itemAt(0) instanceof Node); + + final Source expectedSource = Input.fromString(doc).build(); + final Source actualSource = Input.fromNode((Node) result.itemAt(0)).build(); + final Diff diff = DiffBuilder.compare(expectedSource) + .withTest(actualSource) + .checkForIdentical() + .checkForSimilar() + .build(); + + assertFalse(diff.toString(), diff.hasDifferences()); + } } } @@ -231,22 +232,23 @@ public void doc_dynamicallyAvailableDocument_relativeUri() throws XPathException xqueryContext.addDynamicallyAvailableDocument(baseUri + docRelativeUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); }; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); - final Sequence result = queryResult.result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null)) { + final Sequence result = queryResult.result; - assertFalse(result.isEmpty()); - assertEquals(1, result.getItemCount()); - assertTrue(result.itemAt(0) instanceof Node); + assertFalse(result.isEmpty()); + assertEquals(1, result.getItemCount()); + assertTrue(result.itemAt(0) instanceof Node); - final Source expectedSource = Input.fromString(doc).build(); - final Source actualSource = Input.fromNode((Node)result.itemAt(0)).build(); - final Diff diff = DiffBuilder.compare(expectedSource) - .withTest(actualSource) - .checkForIdentical() - .checkForSimilar() - .build(); + final Source expectedSource = Input.fromString(doc).build(); + final Source actualSource = Input.fromNode((Node) result.itemAt(0)).build(); + final Diff diff = DiffBuilder.compare(expectedSource) + .withTest(actualSource) + .checkForIdentical() + .checkForSimilar() + .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + assertFalse(diff.toString(), diff.hasDifferences()); + } } } @@ -264,12 +266,13 @@ public void docAvailable_dynamicallyAvailableDocument_absoluteUri() throws XPath xqueryContext.addDynamicallyAvailableDocument(docUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); }; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); - final Sequence result = queryResult.result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null)) { + final Sequence result = queryResult.result; - assertFalse(result.isEmpty()); - assertEquals(1, result.getItemCount()); - assertTrue(result.itemAt(0).toJavaObject(Boolean.class).booleanValue()); + assertFalse(result.isEmpty()); + assertEquals(1, result.getItemCount()); + assertTrue(result.itemAt(0).toJavaObject(Boolean.class).booleanValue()); + } } } @@ -292,12 +295,13 @@ public void docAvailable_dynamicallyAvailableDocument_relativeUri() throws XPath xqueryContext.addDynamicallyAvailableDocument(baseUri + docRelativeUri, (broker2, transaction, uri) -> asInMemoryDocument(doc)); }; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); - final Sequence result = queryResult.result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null)) { + final Sequence result = queryResult.result; - assertFalse(result.isEmpty()); - assertEquals(1, result.getItemCount()); - assertTrue(result.itemAt(0).toJavaObject(Boolean.class).booleanValue()); + assertFalse(result.isEmpty()); + assertEquals(1, result.getItemCount()); + assertTrue(result.itemAt(0).toJavaObject(Boolean.class).booleanValue()); + } } } @@ -307,13 +311,14 @@ public void docAvailableInPredicate() throws XPathException, EXistException, Per final String query = "('/db/test.xml', '/db/test/test.xml', '/db/non-existent.xml')[fn:doc-available(.)]"; try (final DBBroker broker = pool.getBroker()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); - final Sequence result = queryResult.result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; - assertFalse(result.isEmpty()); - assertEquals(2, result.getItemCount()); - assertEquals("/db/test.xml", result.itemAt(0).getStringValue()); - assertEquals("/db/test/test.xml", result.itemAt(1).getStringValue()); + assertFalse(result.isEmpty()); + assertEquals(2, result.getItemCount()); + assertEquals("/db/test.xml", result.itemAt(0).getStringValue()); + assertEquals("/db/test/test.xml", result.itemAt(1).getStringValue()); + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/FunUnparsedTextTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/FunUnparsedTextTest.java index 0479c72dab..4a2a77f826 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/FunUnparsedTextTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/FunUnparsedTextTest.java @@ -95,13 +95,14 @@ public void unparsedText_dynamicallyAvailableDocument_absoluteUri() throws XPath xqueryContext.addDynamicallyAvailableTextResource(textUri, UTF_8, (broker2, transaction, uri, charset) -> new InputStreamReader(new ByteArrayInputStream(text.getBytes(UTF_8)), charset)); }; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); - final Sequence result = queryResult.result; - - assertFalse(result.isEmpty()); - assertEquals(1, result.getItemCount()); - assertEquals(Type.STRING, result.itemAt(0).getType()); - assertEquals(text, result.itemAt(0).getStringValue()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null)) { + final Sequence result = queryResult.result; + + assertFalse(result.isEmpty()); + assertEquals(1, result.getItemCount()); + assertEquals(Type.STRING, result.itemAt(0).getType()); + assertEquals(text, result.itemAt(0).getStringValue()); + } } } @@ -125,13 +126,14 @@ public void unparsedText_dynamicallyAvailableDocument_relativeUri() throws XPath } }; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); - final Sequence result = queryResult.result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null)) { + final Sequence result = queryResult.result; - assertFalse(result.isEmpty()); - assertEquals(1, result.getItemCount()); - assertEquals(Type.STRING, result.itemAt(0).getType()); - assertEquals(text, result.itemAt(0).getStringValue()); + assertFalse(result.isEmpty()); + assertEquals(1, result.getItemCount()); + assertEquals(Type.STRING, result.itemAt(0).getType()); + assertEquals(text, result.itemAt(0).getStringValue()); + } } } @@ -149,12 +151,13 @@ public void unparsedTextAvailable_dynamicallyAvailableDocument_absoluteUri() thr xqueryContext.addDynamicallyAvailableTextResource(textUri, UTF_8, (broker2, transaction, uri, charset) -> new InputStreamReader(new ByteArrayInputStream(text.getBytes(UTF_8)), charset)); }; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); - final Sequence result = queryResult.result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null)) { + final Sequence result = queryResult.result; - assertFalse(result.isEmpty()); - assertEquals(1, result.getItemCount()); - assertTrue(result.itemAt(0).toJavaObject(Boolean.class).booleanValue()); + assertFalse(result.isEmpty()); + assertEquals(1, result.getItemCount()); + assertTrue(result.itemAt(0).toJavaObject(Boolean.class).booleanValue()); + } } } @@ -178,12 +181,13 @@ public void unparsedTextAvailable_dynamicallyAvailableDocument_relativeUri() thr } }; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); - final Sequence result = queryResult.result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null)) { + final Sequence result = queryResult.result; - assertFalse(result.isEmpty()); - assertEquals(1, result.getItemCount()); - assertTrue(result.itemAt(0).toJavaObject(Boolean.class).booleanValue()); + assertFalse(result.isEmpty()); + assertEquals(1, result.getItemCount()); + assertTrue(result.itemAt(0).toJavaObject(Boolean.class).booleanValue()); + } } } @@ -200,8 +204,9 @@ public void unparsedTextLines_noDataStream() throws XPathException, EXistExcepti xqueryContext.addDynamicallyAvailableTextResource(textUri, UTF_8, (broker2, transaction, uri, charset) -> new InputStreamReader(null, charset)); }; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null); - final Sequence result = queryResult.result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, setupXqueryContextPreCompilation, null, null)) { + final Sequence result = queryResult.result; + } } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/transform/FunTransformITTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/transform/FunTransformITTest.java index 1486946e58..bf4c7f8df3 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/transform/FunTransformITTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/transform/FunTransformITTest.java @@ -184,8 +184,9 @@ public void identityMixedMemoryAndPersistentDom() throws XPathException, Permiss private static void expectQuery(final String query, final Source expected) throws EXistException, XPathException, PermissionDeniedException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence sequence = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence sequence = queryResult.result; assertNotNull(sequence); assertTrue(sequence.hasOne()); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/inspect/InspectModuleTest.java b/exist-core/src/test/java/org/exist/xquery/functions/inspect/InspectModuleTest.java index f1d0f42855..25aba04a9a 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/inspect/InspectModuleTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/inspect/InspectModuleTest.java @@ -140,25 +140,27 @@ public void xqDoc_withAtSignInline() throws PermissionDeniedException, XPathExce "inspect:inspect-module(xs:anyURI(\"xmldb:exist://" + TEST_COLLECTION.append(TEST_MODULE).toCollectionPathURI() + "\"))\n" + "/function[@name eq \"x:fun1\"]"; - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; - assertNotNull(result); - assertEquals(1, result.getItemCount()); - final Item item1 = result.itemAt(0); - assertTrue(item1 instanceof ElementImpl); + assertNotNull(result); + assertEquals(1, result.getItemCount()); + final Item item1 = result.itemAt(0); + assertTrue(item1 instanceof ElementImpl); - final Element function = (Element)item1; + final Element function = (Element)item1; - final NodeList descriptions = function.getElementsByTagName("description"); - assertEquals(1, descriptions.getLength()); - assertEquals("Some description.", descriptions.item(0).getFirstChild().getTextContent()); + final NodeList descriptions = function.getElementsByTagName("description"); + assertEquals(1, descriptions.getLength()); + assertEquals("Some description.", descriptions.item(0).getFirstChild().getTextContent()); - final NodeList arguments = function.getElementsByTagName("argument"); - assertEquals(0, arguments.getLength()); + final NodeList arguments = function.getElementsByTagName("argument"); + assertEquals(0, arguments.getLength()); - final NodeList returns = function.getElementsByTagName("returns"); - assertEquals(1, returns.getLength()); - assertEquals("taxonomy[@type = \"reign\"]", returns.item(0).getFirstChild().getTextContent()); + final NodeList returns = function.getElementsByTagName("returns"); + assertEquals(1, returns.getLength()); + assertEquals("taxonomy[@type = \"reign\"]", returns.item(0).getFirstChild().getTextContent()); + } transaction.commit(); } @@ -175,27 +177,29 @@ public void xqDoc_withParamsAndReturn() throws PermissionDeniedException, XPathE "inspect:inspect-module(xs:anyURI(\"xmldb:exist://" + TEST_COLLECTION.append(TEST_MODULE).toCollectionPathURI() + "\"))\n" + "/function[@name eq \"x:fun2\"]"; - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; - assertNotNull(result); - assertEquals(1, result.getItemCount()); - final Item item1 = result.itemAt(0); - assertTrue(item1 instanceof ElementImpl); + assertNotNull(result); + assertEquals(1, result.getItemCount()); + final Item item1 = result.itemAt(0); + assertTrue(item1 instanceof ElementImpl); - final Element function = (Element)item1; + final Element function = (Element)item1; - final NodeList descriptions = function.getElementsByTagName("description"); - assertEquals(1, descriptions.getLength()); - assertEquals("Some other description.", descriptions.item(0).getFirstChild().getNodeValue()); + final NodeList descriptions = function.getElementsByTagName("description"); + assertEquals(1, descriptions.getLength()); + assertEquals("Some other description.", descriptions.item(0).getFirstChild().getNodeValue()); - final NodeList arguments = function.getElementsByTagName("argument"); - assertEquals(2, arguments.getLength()); - assertEquals("first parameter", arguments.item(0).getFirstChild().getNodeValue()); - assertEquals("second parameter", arguments.item(1).getFirstChild().getNodeValue()); + final NodeList arguments = function.getElementsByTagName("argument"); + assertEquals(2, arguments.getLength()); + assertEquals("first parameter", arguments.item(0).getFirstChild().getNodeValue()); + assertEquals("second parameter", arguments.item(1).getFirstChild().getNodeValue()); - final NodeList returns = function.getElementsByTagName("returns"); - assertEquals(1, returns.getLength()); - assertEquals("our result", returns.item(0).getFirstChild().getNodeValue()); + final NodeList returns = function.getElementsByTagName("returns"); + assertEquals(1, returns.getLength()); + assertEquals("our result", returns.item(0).getFirstChild().getNodeValue()); + } transaction.commit(); } @@ -212,25 +216,27 @@ public void xqDoc_multilineDesciption() throws PermissionDeniedException, XPathE "inspect:inspect-module(xs:anyURI(\"xmldb:exist://" + TEST_COLLECTION.append(TEST_MODULE).toCollectionPathURI() + "\"))\n" + "/function[@name eq \"x:fun3\"]"; - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; - assertNotNull(result); - assertEquals(1, result.getItemCount()); - final Item item1 = result.itemAt(0); - assertTrue(item1 instanceof ElementImpl); + assertNotNull(result); + assertEquals(1, result.getItemCount()); + final Item item1 = result.itemAt(0); + assertTrue(item1 instanceof ElementImpl); - final Element function = (Element)item1; + final Element function = (Element)item1; - final NodeList descriptions = function.getElementsByTagName("description"); - assertEquals(1, descriptions.getLength()); - assertEquals("This is a multiline description and therefore\n spans multiple\n lines.", descriptions.item(0).getFirstChild().getNodeValue()); + final NodeList descriptions = function.getElementsByTagName("description"); + assertEquals(1, descriptions.getLength()); + assertEquals("This is a multiline description and therefore\n spans multiple\n lines.", descriptions.item(0).getFirstChild().getNodeValue()); - final NodeList arguments = function.getElementsByTagName("argument"); - assertEquals(0, arguments.getLength()); + final NodeList arguments = function.getElementsByTagName("argument"); + assertEquals(0, arguments.getLength()); - final NodeList returns = function.getElementsByTagName("returns"); - assertEquals(1, returns.getLength()); - assertEquals("another result", returns.item(0).getFirstChild().getNodeValue()); + final NodeList returns = function.getElementsByTagName("returns"); + assertEquals(1, returns.getLength()); + assertEquals("another result", returns.item(0).getFirstChild().getNodeValue()); + } transaction.commit(); } @@ -247,31 +253,33 @@ public void xqDoc_onAnnotatedFunction() throws PermissionDeniedException, XPathE "inspect:inspect-module(xs:anyURI(\"xmldb:exist://" + TEST_COLLECTION.append(TEST_MODULE).toCollectionPathURI() + "\"))\n" + "/function[@name eq \"x:fun4\"]"; - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; - assertNotNull(result); - assertEquals(1, result.getItemCount()); - final Item item1 = result.itemAt(0); - assertTrue(item1 instanceof ElementImpl); + assertNotNull(result); + assertEquals(1, result.getItemCount()); + final Item item1 = result.itemAt(0); + assertTrue(item1 instanceof ElementImpl); - final Element function = (Element)item1; + final Element function = (Element)item1; - final NodeList descriptions = function.getElementsByTagName("description"); - assertEquals(1, descriptions.getLength()); - assertEquals("An annotated function.", descriptions.item(0).getFirstChild().getNodeValue()); + final NodeList descriptions = function.getElementsByTagName("description"); + assertEquals(1, descriptions.getLength()); + assertEquals("An annotated function.", descriptions.item(0).getFirstChild().getNodeValue()); - final NodeList annotations = function.getElementsByTagName("annotation"); - assertEquals(2, annotations.getLength()); - assertEquals("public", ((Element)annotations.item(0)).getAttribute("name")); - assertEquals("x:path", ((Element)annotations.item(1)).getAttribute("name")); - assertEquals("/x/y/z", annotations.item(1).getFirstChild().getFirstChild().getNodeValue()); + final NodeList annotations = function.getElementsByTagName("annotation"); + assertEquals(2, annotations.getLength()); + assertEquals("public", ((Element)annotations.item(0)).getAttribute("name")); + assertEquals("x:path", ((Element)annotations.item(1)).getAttribute("name")); + assertEquals("/x/y/z", annotations.item(1).getFirstChild().getFirstChild().getNodeValue()); - final NodeList arguments = function.getElementsByTagName("argument"); - assertEquals(0, arguments.getLength()); + final NodeList arguments = function.getElementsByTagName("argument"); + assertEquals(0, arguments.getLength()); - final NodeList returns = function.getElementsByTagName("returns"); - assertEquals(1, returns.getLength()); - assertEquals("another result", returns.item(0).getFirstChild().getNodeValue()); + final NodeList returns = function.getElementsByTagName("returns"); + assertEquals(1, returns.getLength()); + assertEquals("another result", returns.item(0).getFirstChild().getNodeValue()); + } transaction.commit(); } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/AccountManagementFunctionRemoveAccountTest.java b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/AccountManagementFunctionRemoveAccountTest.java index 8c8adce44c..b84f9d9d52 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/AccountManagementFunctionRemoveAccountTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/AccountManagementFunctionRemoveAccountTest.java @@ -74,31 +74,31 @@ public class AccountManagementFunctionRemoveAccountTest { public void cannotDeleteSystemAccount() throws XPathException, PermissionDeniedException, EXistException, AuthenticationException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Subject admin = pool.getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - extractPermissionDenied(() -> xqueryRemoveAccount(SecurityManager.SYSTEM, Optional.of(admin))); + extractPermissionDenied(() -> xqueryRemoveAccount(SecurityManager.SYSTEM, Optional.of(admin)).close()); } @Test(expected = PermissionDeniedException.class) public void cannotDeleteDbaAccount() throws XPathException, PermissionDeniedException, EXistException, IOException { - extractPermissionDenied(() -> xqueryRemoveAccount(SecurityManager.DBA_USER)); + extractPermissionDenied(() -> xqueryRemoveAccount(SecurityManager.DBA_USER).close()); } @Test(expected = PermissionDeniedException.class) public void cannotDeleteGuestAccount() throws XPathException, PermissionDeniedException, EXistException, IOException { - extractPermissionDenied(() -> xqueryRemoveAccount(SecurityManager.GUEST_USER)); + extractPermissionDenied(() -> xqueryRemoveAccount(SecurityManager.GUEST_USER).close()); } @Test(expected = PermissionDeniedException.class) public void cannotDeleteUnknownAccount() throws XPathException, PermissionDeniedException, EXistException, IOException { - extractPermissionDenied(() -> xqueryRemoveAccount(SecurityManager.UNKNOWN_USER)); + extractPermissionDenied(() -> xqueryRemoveAccount(SecurityManager.UNKNOWN_USER).close()); } - private Sequence xqueryRemoveAccount(final String username) throws XPathException, PermissionDeniedException, EXistException, IOException { + private XQueryUtil.QueryResult xqueryRemoveAccount(final String username) throws XPathException, PermissionDeniedException, EXistException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final Optional asUser = Optional.of(pool.getSecurityManager().getSystemSubject()); return xqueryRemoveAccount(username, asUser); } - private Sequence xqueryRemoveAccount(final String username, final Optional asUser) throws EXistException, PermissionDeniedException, XPathException, IOException { + private XQueryUtil.QueryResult xqueryRemoveAccount(final String username, final Optional asUser) throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existWebServer.getBrokerPool(); final String query = @@ -106,7 +106,7 @@ private Sequence xqueryRemoveAccount(final String username, final Optional"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.getBroker()) { + try (final DBBroker broker = pool.getBroker(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + final Sequence result = queryResult.result; assertEquals(1, result.getItemCount()); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupManagementFunctionRemoveGroupTest.java b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupManagementFunctionRemoveGroupTest.java index a280cac0d4..d1bc4a931d 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupManagementFunctionRemoveGroupTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupManagementFunctionRemoveGroupTest.java @@ -77,21 +77,21 @@ public class GroupManagementFunctionRemoveGroupTest { @Test(expected = PermissionDeniedException.class) public void cannotDeleteDbaGroup() throws XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDenied(() -> { - xqueryRemoveGroup(existWebServer.getBrokerPool(), SecurityManager.DBA_GROUP); + xqueryRemoveGroup(existWebServer.getBrokerPool(), SecurityManager.DBA_GROUP).close(); }); } @Test(expected = PermissionDeniedException.class) public void cannotDeleteGuestGroup() throws XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDenied(() -> { - xqueryRemoveGroup(existWebServer.getBrokerPool(), SecurityManager.GUEST_GROUP); + xqueryRemoveGroup(existWebServer.getBrokerPool(), SecurityManager.GUEST_GROUP).close(); }); } @Test(expected = PermissionDeniedException.class) public void cannotDeleteUnknownGroup() throws XPathException, PermissionDeniedException, EXistException, IOException { extractPermissionDenied(() -> { - xqueryRemoveGroup(existWebServer.getBrokerPool(), SecurityManager.UNKNOWN_GROUP); + xqueryRemoveGroup(existWebServer.getBrokerPool(), SecurityManager.UNKNOWN_GROUP).close(); }); } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupMembershipFunctionRemoveGroupMemberTest.java b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupMembershipFunctionRemoveGroupMemberTest.java index 1eafce23f3..2bcb1cfc1f 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupMembershipFunctionRemoveGroupMemberTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/GroupMembershipFunctionRemoveGroupMemberTest.java @@ -80,9 +80,9 @@ public void cannotRemoveAllGroupsFromUserAsOwner() throws XPathException, Permis final BrokerPool pool = existWebServer.getBrokerPool(); final Subject owner = pool.getSecurityManager().authenticate(USER1_NAME, USER1_NAME); extractPermissionDenied(() -> { - xqueryRemoveUserFromGroup(pool, USER1_NAME, OTHER_GROUP2_NAME, Optional.of(owner)); - xqueryRemoveUserFromGroup(pool, USER1_NAME, OTHER_GROUP1_NAME, Optional.of(owner)); - xqueryRemoveUserFromGroup(pool, USER1_NAME, USER1_NAME, Optional.of(owner)); + xqueryRemoveUserFromGroup(pool, USER1_NAME, OTHER_GROUP2_NAME, Optional.of(owner)).close(); + xqueryRemoveUserFromGroup(pool, USER1_NAME, OTHER_GROUP1_NAME, Optional.of(owner)).close(); + xqueryRemoveUserFromGroup(pool, USER1_NAME, USER1_NAME, Optional.of(owner)).close(); }); } @@ -91,9 +91,9 @@ public void cannotRemoveAllGroupsFromUserAsDBA() throws XPathException, Permissi final BrokerPool pool = existWebServer.getBrokerPool(); final Subject admin = pool.getSecurityManager().authenticate(TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); extractPermissionDenied(() -> { - xqueryRemoveUserFromGroup(pool, USER1_NAME, OTHER_GROUP2_NAME, Optional.of(admin)); - xqueryRemoveUserFromGroup(pool, USER1_NAME, OTHER_GROUP1_NAME, Optional.of(admin)); - xqueryRemoveUserFromGroup(pool, USER1_NAME, USER1_NAME, Optional.of(admin)); + xqueryRemoveUserFromGroup(pool, USER1_NAME, OTHER_GROUP2_NAME, Optional.of(admin)).close(); + xqueryRemoveUserFromGroup(pool, USER1_NAME, OTHER_GROUP1_NAME, Optional.of(admin)).close(); + xqueryRemoveUserFromGroup(pool, USER1_NAME, USER1_NAME, Optional.of(admin)).close(); }); } @@ -109,11 +109,11 @@ public void setup() throws EXistException, PermissionDeniedException, XPathExcep final Group otherGroup1 = createGroup(broker, sm, OTHER_GROUP1_NAME); addUserToGroup(sm, user1, otherGroup1); - xqueryAddUserAsGroupManager(pool, USER1_NAME, OTHER_GROUP1_NAME); + xqueryAddUserAsGroupManager(pool, USER1_NAME, OTHER_GROUP1_NAME).close(); final Group otherGroup2 = createGroup(broker, sm, OTHER_GROUP2_NAME); addUserToGroup(sm, user1, otherGroup2); - xqueryAddUserAsGroupManager(pool, USER1_NAME, OTHER_GROUP2_NAME); + xqueryAddUserAsGroupManager(pool, USER1_NAME, OTHER_GROUP2_NAME).close(); transaction.commit(); } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/PermissionsFunctionChownTest.java b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/PermissionsFunctionChownTest.java index edccdec185..704067f4f3 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/PermissionsFunctionChownTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/PermissionsFunctionChownTest.java @@ -1562,9 +1562,10 @@ private void changeOwner(final Subject execAsUser, final boolean restricted, fin "sm:chown(xs:anyURI('" + uri.getRawCollectionPath() + "'), '" + newOwnerGroup + "'),\n" + "sm:get-permissions(xs:anyURI('" + uri.getRawCollectionPath() + "'))/sm:permission/(string(@owner), string(@group))"; - try (final DBBroker broker = pool.get(Optional.of(execAsUser))) { + try (final DBBroker broker = pool.get(Optional.of(execAsUser)); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + final Sequence result = queryResult.result; assertEquals(2, result.getItemCount()); @@ -1593,9 +1594,10 @@ private void changeGroup(final Subject execAsUser, final boolean restricted, fin "sm:chgrp(xs:anyURI('" + uri.getRawCollectionPath() + "'), '" + newGroup + "'),\n" + "sm:get-permissions(xs:anyURI('" + uri.getRawCollectionPath() + "'))/sm:permission/string(@group)"; - try (final DBBroker broker = pool.get(Optional.of(execAsUser))) { + try (final DBBroker broker = pool.get(Optional.of(execAsUser)); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + final Sequence result = queryResult.result; assertEquals(1, result.getItemCount()); assertEquals(expectedGroup, result.itemAt(0).getStringValue()); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/SecurityManagerTestUtil.java b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/SecurityManagerTestUtil.java index 12e0279a12..d766cf7308 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/SecurityManagerTestUtil.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/securitymanager/SecurityManagerTestUtil.java @@ -104,41 +104,38 @@ static void removeGroup(final SecurityManager sm, final String groupname) throws sm.deleteGroup(groupname); } - static Sequence xqueryAddUserAsGroupManager(final BrokerPool pool, final String username, final String groupname) throws EXistException, PermissionDeniedException, XPathException, IOException { + static XQueryUtil.QueryResult xqueryAddUserAsGroupManager(final BrokerPool pool, final String username, final String groupname) throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "import module namespace sm = 'http://exist-db.org/xquery/securitymanager';\n" + "sm:add-group-manager('" + groupname + "', '" + username + "')"; try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - return result; + return XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); } } - static Sequence xqueryRemoveUserFromGroup(final BrokerPool pool, final String username, final String groupname) throws XPathException, PermissionDeniedException, EXistException, IOException { + static XQueryUtil.QueryResult xqueryRemoveUserFromGroup(final BrokerPool pool, final String username, final String groupname) throws XPathException, PermissionDeniedException, EXistException, IOException { final Optional asUser = Optional.of(pool.getSecurityManager().getSystemSubject()); return xqueryRemoveUserFromGroup(pool, username, groupname, asUser); } - static Sequence xqueryRemoveUserFromGroup(final BrokerPool pool, final String username, final String groupname, final Optional asUser) throws EXistException, PermissionDeniedException, XPathException, IOException { + static XQueryUtil.QueryResult xqueryRemoveUserFromGroup(final BrokerPool pool, final String username, final String groupname, final Optional asUser) throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "import module namespace sm = 'http://exist-db.org/xquery/securitymanager';\n" + "sm:remove-group-member('" + groupname + "', '" + username + "')"; try (final DBBroker broker = pool.get(asUser)) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - return result; + return XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); } } - static Sequence xqueryRemoveGroup(final BrokerPool pool, final String groupname) throws EXistException, PermissionDeniedException, XPathException, IOException { + static XQueryUtil.QueryResult xqueryRemoveGroup(final BrokerPool pool, final String groupname) throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "import module namespace sm = 'http://exist-db.org/xquery/securitymanager';\n" + "sm:remove-group('" + groupname + "')"; try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - return result; + return XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); } } @@ -148,9 +145,10 @@ static void xqueryChangeMode(final BrokerPool pool, final Subject execAsUser, fi "sm:chmod(xs:anyURI('" + uri.getRawCollectionPath() + "'), '" + newMode + "'),\n" + "sm:get-permissions(xs:anyURI('" + uri.getRawCollectionPath() + "'))/sm:permission/string(@mode)"; - try (final DBBroker broker = pool.get(Optional.of(execAsUser))) { + try (final DBBroker broker = pool.get(Optional.of(execAsUser)); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + final Sequence result = queryResult.result; assertEquals(1, result.getItemCount()); assertEquals(newMode, result.itemAt(0).getStringValue()); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformTest.java b/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformTest.java index 8912e29f39..d12526f387 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformTest.java @@ -239,9 +239,10 @@ public class TransformTest { @Test public void keys() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(LIST_OPS_XQUERY), false, null, null, null, null, null)) { - final Sequence sequence = XQueryUtil.query(broker, new StringSource(LIST_OPS_XQUERY), false, null, null, null, null, null).result; + final Sequence sequence = queryResult.result; assertNotNull(sequence); assertEquals(1, sequence.getItemCount()); @@ -263,8 +264,9 @@ public void keys() throws EXistException, PermissionDeniedException, XPathExcept @Test public void xslDocument() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence sequence = XQueryUtil.query(broker, new StringSource(DOCUMENT_XSLT_QUERY), false, null, null, null, null, null).result; + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(DOCUMENT_XSLT_QUERY), false, null, null, null, null, null)) { + final Sequence sequence = queryResult.result; assertNotNull(sequence); assertTrue(sequence.hasOne()); @@ -327,8 +329,9 @@ public void twoNodesCountDescendants() throws EXistException, PermissionDeniedEx private static void transform1(final XmldbURI collectionUri) throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence sequence = XQueryUtil.query(broker, new StringSource(getCountDescendantsXquery(collectionUri)), false, null, null, null, null, null).result; + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(getCountDescendantsXquery(collectionUri)), false, null, null, null, null, null)) { + final Sequence sequence = queryResult.result; assertNotNull(sequence); assertTrue(sequence.hasOne()); @@ -379,8 +382,9 @@ private static String getCountDescendantsXslt(final XmldbURI collectionUri) { private static void transform_twoNodesCountDescendants() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence sequence = XQueryUtil.query(broker, new StringSource(COUNT_DESCENDANTS_TWO_NODES_QUERY), false, null, null, null, null, null).result; + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(COUNT_DESCENDANTS_TWO_NODES_QUERY), false, null, null, null, null, null)) { + final Sequence sequence = queryResult.result; assertNotNull(sequence); assertTrue(sequence.hasOne()); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/util/ParseHtmlTest.java b/exist-core/src/test/java/org/exist/xquery/functions/util/ParseHtmlTest.java index 45f39ca563..dabad949ea 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/util/ParseHtmlTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/util/ParseHtmlTest.java @@ -75,8 +75,9 @@ public class ParseHtmlTest { public void parseHtml() throws EXistException, PermissionDeniedException, XPathException, IOException { final String query = "util:parse-html(\"

hello

\")"; - try (final DBBroker broker = server.getBrokerPool().getBroker()) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final DBBroker broker = server.getBrokerPool().getBroker(); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; assertEquals(1, result.getItemCount()); assertTrue(result.itemAt(0) instanceof DocumentImpl); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/xquery3/SerializeTest.java b/exist-core/src/test/java/org/exist/xquery/functions/xquery3/SerializeTest.java index 03dfebb446..aa21735b7d 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/xquery3/SerializeTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/xquery3/SerializeTest.java @@ -144,8 +144,9 @@ private static void expectQueryString(final String query, final String expected) private static void expectQuery(final String query, final Consumer resultConsumer) throws EXistException, XPathException, PermissionDeniedException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence result = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence result = queryResult.result; resultConsumer.accept(result); } } diff --git a/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTriggersDefragTest.java b/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTriggersDefragTest.java index ba3d3f5c9e..f11622cb62 100644 --- a/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTriggersDefragTest.java +++ b/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTriggersDefragTest.java @@ -110,11 +110,12 @@ private void assertQuery(final String query, final Consumer2Eheiterkeit"); }; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } setupXqueryContextPreExecution = xqueryContext -> { xqueryContext.declareVariable("q", true, @@ -653,9 +713,11 @@ public void queryTranslation() throws EXistException, CollectionConfigurationExc "" ); }; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } setupXqueryContextPreExecution = xqueryContext -> { xqueryContext.declareVariable("q", true, @@ -666,9 +728,11 @@ public void queryTranslation() throws EXistException, CollectionConfigurationExc "" ); }; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } setupXqueryContextPreExecution = xqueryContext -> { xqueryContext.declareVariable("q", true, @@ -679,9 +743,11 @@ public void queryTranslation() throws EXistException, CollectionConfigurationExc "" ); }; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(0, seq.getItemCount()); + } setupXqueryContextPreExecution = xqueryContext -> { xqueryContext.declareVariable("q", true, @@ -692,9 +758,11 @@ public void queryTranslation() throws EXistException, CollectionConfigurationExc "" ); }; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(0, seq.getItemCount()); + } setupXqueryContextPreExecution = xqueryContext -> { xqueryContext.declareVariable("q", true, @@ -705,9 +773,11 @@ public void queryTranslation() throws EXistException, CollectionConfigurationExc "" ); }; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } setupXqueryContextPreExecution = xqueryContext -> { xqueryContext.declareVariable("q", true, @@ -716,9 +786,11 @@ public void queryTranslation() throws EXistException, CollectionConfigurationExc "" ); }; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } // phrase with wildcards setupXqueryContextPreExecution = xqueryContext -> { @@ -728,9 +800,11 @@ public void queryTranslation() throws EXistException, CollectionConfigurationExc "" ); }; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } setupXqueryContextPreExecution = xqueryContext -> { xqueryContext.declareVariable("q", true, @@ -739,9 +813,11 @@ public void queryTranslation() throws EXistException, CollectionConfigurationExc "" ); }; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } setupXqueryContextPreExecution = xqueryContext -> { xqueryContext.declareVariable("q", true, @@ -750,9 +826,11 @@ public void queryTranslation() throws EXistException, CollectionConfigurationExc "" ); }; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } setupXqueryContextPreExecution = xqueryContext -> { xqueryContext.declareVariable("q", true, @@ -764,9 +842,11 @@ public void queryTranslation() throws EXistException, CollectionConfigurationExc "" ); }; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } setupXqueryContextPreExecution = xqueryContext -> { xqueryContext.declareVariable("q", true, @@ -775,9 +855,11 @@ public void queryTranslation() throws EXistException, CollectionConfigurationExc "" ); }; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } setupXqueryContextPreExecution = xqueryContext -> { xqueryContext.declareVariable("q", true, @@ -786,9 +868,11 @@ public void queryTranslation() throws EXistException, CollectionConfigurationExc "" ); }; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, setupXqueryContextPreExecution, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } } } @@ -802,19 +886,25 @@ public void analyzers() throws EXistException, CollectionConfigurationException, checkIndex(docs, broker, new QName[] { new QName("p") }, "uppercase", 1); String query = "/section[ft:query(p, 'UPPERCASE')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } query = "/section[ft:query(head, 'TITLE')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } query = "/section[ft:query(head, 'title')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(0, seq.getItemCount()); + } } } @@ -829,20 +919,24 @@ public void MultiTermQueryRewriteMethod() throws EXistException, CollectionConfi " let $query := {$expr}" + " return for $hit in //tei:p[ft:query(., $query)]" + " return util:expand($hit)//exist:match"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(10, seq.getItemCount()); - assertEquals("aus", seq.itemAt(0).getStringValue()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(10, seq.getItemCount()); + assertEquals("aus", seq.itemAt(0).getStringValue()); + } query = "declare namespace tei=\"http://www.tei-c.org/ns/1.0\";" + " for $expr in (\"ha*\", \"ma*\")" + " let $query := {$expr}" + " return for $hit in //tei:p[ft:query(., $query)]" + " return util:expand($hit)//exist:match"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(2 , seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(2, seq.getItemCount()); assertEquals("haus", seq.itemAt(0).getStringValue()); + } } } @@ -871,17 +965,21 @@ public void dropDocuments() throws EXistException, CollectionConfigurationExcept try(final Txn transaction = transact.beginTransaction()) { String query = "//LINE[ft:query(., 'bark')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(6, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(6, seq.getItemCount()); + } root.removeXMLResource(transaction, broker, XmldbURI.create("r_and_j.xml")); transact.commit(transaction); query = "//LINE[ft:query(., 'bark')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(3, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(3, seq.getItemCount()); + } } try(final Txn transaction = transact.beginTransaction()) { @@ -889,9 +987,11 @@ public void dropDocuments() throws EXistException, CollectionConfigurationExcept transact.commit(transaction); String query = "//LINE[ft:query(., 'bark')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } } } } @@ -905,9 +1005,11 @@ public void removeCollection() throws EXistException, CollectionConfigurationExc final Txn transaction = transact.beginTransaction()) { String query = "//SPEECH[ft:query(LINE, 'love')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(166, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(166, seq.getItemCount()); + } broker.removeCollection(transaction, root); @@ -964,9 +1066,11 @@ public void xupdateRemove() throws EXistException, CollectionConfigurationExcept checkIndex(docs, broker, new QName[] { new QName("condition") }, null, 2); String query = "//item[ft:query(description, 'chair')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } final XUpdateProcessor proc = new XUpdateProcessor(broker, docs); assertNotNull(proc); @@ -1042,9 +1146,11 @@ public void xupdateInsert() throws EXistException, CollectionConfigurationExcept checkIndex(docs, broker, new QName[] { new QName("item") }, null, 5); String query = "//item[ft:query(description, 'chair')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } // Append to root node final XUpdateProcessor proc = new XUpdateProcessor(broker, docs); @@ -1206,9 +1312,11 @@ public void xupdateUpdate() throws EXistException, CollectionConfigurationExcept checkIndex(docs, broker, new QName[] { new QName("item") }, null, 5); String query = "//item[ft:query(description, 'chair')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } // Update element content final XUpdateProcessor proc = new XUpdateProcessor(broker, docs); @@ -1283,9 +1391,11 @@ public void xupdateReplace() throws EXistException, CollectionConfigurationExcep checkIndex(docs, broker, new QName[] { new QName("item") }, null, 5); String query = "//item[ft:query(description, 'chair')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } final XUpdateProcessor proc = new XUpdateProcessor(broker, docs); assertNotNull(proc); diff --git a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/LuceneMatchListenerTest.java b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/LuceneMatchListenerTest.java index c93fe6a49c..c68f0962c1 100644 --- a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/LuceneMatchListenerTest.java +++ b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/LuceneMatchListenerTest.java @@ -198,39 +198,49 @@ public void indexByQName() throws EXistException, PermissionDeniedException, XPa try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "//para[ft:query(., 'mixed')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - String result = queryResult2String(broker, seq); - assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with " + MATCH_START + "mixed" + MATCH_END + " content.")); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with " + MATCH_START + "mixed" + MATCH_END + " content.")); + } query = "//para[ft:query(., '+nested +inner +elements')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq); - assertThat(result, CompareMatcher.isIdenticalTo("another paragraph with " + MATCH_START + "nested" + MATCH_END + " " + MATCH_START + "inner" + MATCH_END + " " + MATCH_START + "elements" + MATCH_END + ".")); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, CompareMatcher.isIdenticalTo("another paragraph with " + MATCH_START + "nested" + MATCH_END + " " + MATCH_START + "inner" + MATCH_END + " " + MATCH_START + "elements" + MATCH_END + ".")); + } query = "//para[ft:query(term, 'term')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq); - assertThat(result, CompareMatcher.isIdenticalTo("a third paragraph with " + MATCH_START + "term" + MATCH_END + ".")); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, CompareMatcher.isIdenticalTo("a third paragraph with " + MATCH_START + "term" + MATCH_END + ".")); + } query = "//para[ft:query(., '+double +match')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "double" + MATCH_END + " " + MATCH_START + "match" + MATCH_END + " " + MATCH_START + "double" + MATCH_END + " " + MATCH_START + "match" + MATCH_END + "")); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "double" + MATCH_END + " " + MATCH_START + "match" + MATCH_END + " " + MATCH_START + "double" + MATCH_END + " " + MATCH_START + "match" + MATCH_END + "")); + } query = "for $para in //para[ft:query(., '+double +match')] return {$para}"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "double" + MATCH_END + " " + MATCH_START + "match" + MATCH_END + " " + MATCH_START + "double" + MATCH_END + " " + MATCH_START + "match" + MATCH_END + "")); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "double" + MATCH_END + " " + MATCH_START + "match" + MATCH_END + " " + MATCH_START + "double" + MATCH_END + " " + MATCH_START + "match" + MATCH_END + "")); + } } } @@ -240,18 +250,22 @@ public void matchInAncestor() throws EXistException, PermissionDeniedException, final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "//para[ft:query(., 'mixed')]/hi"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - String result = queryResult2String(broker, seq); - assertThat(result, hasXPath("count(//exist:match)", equalTo("1")).withNamespaceContext(NS_CONTEXT)); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, hasXPath("count(//exist:match)", equalTo("1")).withNamespaceContext(NS_CONTEXT)); + } query = "//para[ft:query(., 'nested')]/note"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq); - assertThat(result, hasXPath("count(//hi/exist:match)", equalTo("1")).withNamespaceContext(NS_CONTEXT)); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, hasXPath("count(//hi/exist:match)", equalTo("1")).withNamespaceContext(NS_CONTEXT)); + } } } @@ -261,18 +275,22 @@ public void matchInDescendant() throws EXistException, PermissionDeniedException final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "//hi[ft:query(., 'mixed')]/ancestor::para"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - String result = queryResult2String(broker, seq); - assertThat(result, hasXPath("count(//exist:match)", equalTo("1")).withNamespaceContext(NS_CONTEXT)); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, hasXPath("count(//exist:match)", equalTo("1")).withNamespaceContext(NS_CONTEXT)); + } query = "//hi[ft:query(., 'nested')]/parent::note"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq); - assertThat(result, hasXPath("count(//hi/exist:match)", equalTo("1")).withNamespaceContext(NS_CONTEXT)); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, hasXPath("count(//hi/exist:match)", equalTo("1")).withNamespaceContext(NS_CONTEXT)); + } } } @@ -283,39 +301,49 @@ public void inlineNodes_whenNotIndenting() throws EXistException, PermissionDeni final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "//p[ft:query(., 'mixed')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - String result = queryResult2String(broker, seq); - assertThat(result, CompareMatcher.isIdenticalTo("

Paragraphs with " + MATCH_START + "mix" + MATCH_END + "ed content are dangerous.

")); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, CompareMatcher.isIdenticalTo("

Paragraphs with " + MATCH_START + "mix" + MATCH_END + "ed content are dangerous.

")); + } query = "//p[ft:query(., 'ignored')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq); - assertThat(result, CompareMatcher.isIdenticalTo("

A simplesic paragraph with highlighted text and a note to be " + MATCH_START + "ignored" + MATCH_END + ".

")); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, CompareMatcher.isIdenticalTo("

A simplesic paragraph with highlighted text and a note to be " + MATCH_START + "ignored" + MATCH_END + ".

")); + } query = "//p[ft:query(., 'highlighted')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq); - assertThat(result, CompareMatcher.isIdenticalTo("

A simplesic paragraph with " + MATCH_START + "highlighted" + MATCH_END + " text and a note to be " + "ignored.

")); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, CompareMatcher.isIdenticalTo("

A simplesic paragraph with " + MATCH_START + "highlighted" + MATCH_END + " text and a note to be " + "ignored.

")); + } query = "//p[ft:query(., 'highlighted')]/hi"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "highlighted" + MATCH_END + "")); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "highlighted" + MATCH_END + "")); + } query = "//head[ft:query(., 'title')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq); - assertThat(result, CompareMatcher.isIdenticalTo("The " + MATCH_START + "title" + MATCH_END + "of it")); + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq); + assertThat(result, CompareMatcher.isIdenticalTo("The " + MATCH_START + "title" + MATCH_END + "of it")); + } } } @@ -327,10 +355,13 @@ public void inlineMatchNodes_whenIndenting() throws EXistException, PermissionDe try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { final String query = "declare namespace tei=\"http://www.tei-c.org/ns/1.0\";" + "//tei:p[.//tei:w[ft:query(., дознајем)]] ! util:expand(.)"; - final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - final String result = queryResult2String(broker, seq, true); + final String result; + try (final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + result = queryResult2String(broker, seq, true); + } final String expected = "

\n" + diff --git a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/SerializeAttrMatchesTest.java b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/SerializeAttrMatchesTest.java index 0eab1e0ffa..7a2ca9ae56 100644 --- a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/SerializeAttrMatchesTest.java +++ b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/SerializeAttrMatchesTest.java @@ -113,8 +113,9 @@ public void expandAttr() throws CollectionConfigurationException, LockException, "return util:expand($hit, \"highlight-matches=both\")"; final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); + final XQueryUtil.QueryResult qr = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = qr.result; assertEquals(1, seq.getItemCount()); diff --git a/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/CustomIndexTest.java b/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/CustomIndexTest.java index 1e14715740..becc5c55c8 100644 --- a/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/CustomIndexTest.java +++ b/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/CustomIndexTest.java @@ -136,14 +136,16 @@ public void xupdateRemove() throws EXistException, PermissionDeniedException, XP final TransactionManager transact = pool.getTransactionManager(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = transact.beginTransaction()) { - + checkIndex(broker, docs, "cha", 1); checkIndex(broker, docs, "le8", 1); String query = "//item[ngram:contains(., 'cha')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } XUpdateProcessor proc = new XUpdateProcessor(broker, docs); assertNotNull(proc); @@ -224,9 +226,11 @@ public void xupdateInsert() throws EXistException, LockException, XPathException assertNotNull(xquery); String query = "//item[ngram:contains(., 'cha')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } XUpdateProcessor proc = new XUpdateProcessor(broker, docs); assertNotNull(proc); @@ -340,9 +344,11 @@ public void xupdateUpdate() throws EXistException, LockException, XPathException checkIndex(broker, docs, "le8", 1); String query = "//item[ngram:contains(., 'cha')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } XUpdateProcessor proc = new XUpdateProcessor(broker, docs); assertNotNull(proc); @@ -400,9 +406,11 @@ public void xupdateReplace() throws LockException, XPathException, PermissionDen checkIndex(broker, docs, "le8", 1); String query = "//item[ngram:contains(., 'cha')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } XUpdateProcessor proc = new XUpdateProcessor(broker, docs); assertNotNull(proc); @@ -452,9 +460,11 @@ public void xupdateRename() throws EXistException, LockException, XPathException checkIndex(broker, docs, "le8", 1); String query = "//item[ngram:contains(., 'cha')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } XUpdateProcessor proc = new XUpdateProcessor(broker, docs); assertNotNull(proc); @@ -489,19 +499,25 @@ public void reindex() throws PermissionDeniedException, XPathException, URISynta checkIndex(broker, docs, "le8", 1); String query = "//item[ngram:contains(., 'cha')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } query = "//section[ngram:contains(para, '123')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } query = "//section[ngram:contains(para, '123')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } transact.commit(transaction); } @@ -515,9 +531,11 @@ public void dropIndex() throws EXistException, PermissionDeniedException, XPathE final Txn transaction = transact.beginTransaction()) { String query = "//item[ngram:contains(., 'cha')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } checkIndex(broker, docs, "cha", 1); checkIndex(broker, docs, "le8", 1); @@ -530,9 +548,11 @@ public void dropIndex() throws EXistException, PermissionDeniedException, XPathE checkIndex(broker, docs, "cha", 0); query = "//item[ngram:contains(., 'cha')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(0, seq.getItemCount()); + } transact.commit(transaction); } @@ -543,24 +563,32 @@ public void query() throws PermissionDeniedException, XPathException, EXistExcep final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "//item[ngram:contains(., 'cha')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } query = "//section[ngram:contains(*, '123')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } query = "//section[ngram:contains(para, '123')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } query = "//*[ngram:contains(., '567')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } } } @@ -571,24 +599,32 @@ public void indexKeys() throws SAXException, PermissionDeniedException, XPathExc try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "util:index-key-occurrences(/test/item, 'cha', 'ngram-index')"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } query = "util:index-key-occurrences(/test/item, 'le8', 'ngram-index')"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } query = "util:index-key-documents(/test/item, 'le8', 'ngram-index')"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } query = "util:index-key-documents(/test/item, 'le8', 'ngram-index')"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + } String queryBody = "declare function local:callback($key as item(), $data as xs:int+)\n" + @@ -601,21 +637,23 @@ public void indexKeys() throws SAXException, PermissionDeniedException, XPathExc "\n"; query = queryBody + "util:index-keys(/test/item, \'\', util:function(xs:QName(\'local:callback\'), 2), 1000, 'ngram-index')"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - //TODO : check cardinality - try (final StringBuilderWriter out = new StringBuilderWriter()) { - Properties props = new Properties(); - props.setProperty(OutputKeys.INDENT, "yes"); - SAXSerializer serializer = new SAXSerializer(out, props); - serializer.startDocument(); - for (SequenceIterator i = seq.iterate(); i.hasNext(); ) { - Item next = i.nextItem(); - next.toSAX(broker, serializer, props); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + //TODO : check cardinality + try (final StringBuilderWriter out = new StringBuilderWriter()) { + Properties props = new Properties(); + props.setProperty(OutputKeys.INDENT, "yes"); + SAXSerializer serializer = new SAXSerializer(out, props); + serializer.startDocument(); + for (SequenceIterator i = seq.iterate(); i.hasNext(); ) { + Item next = i.nextItem(); + next.toSAX(broker, serializer, props); + } + serializer.endDocument(); } - serializer.endDocument(); + //TODO : check content } - //TODO : check content } diff --git a/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/MatchListenerTest.java b/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/MatchListenerTest.java index f6916262dd..e67b32408b 100644 --- a/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/MatchListenerTest.java +++ b/extensions/indexes/ngram/src/test/java/org/exist/indexing/ngram/MatchListenerTest.java @@ -160,32 +160,40 @@ public void nestedContent() throws PermissionDeniedException, IOException, LockE final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { String query = "//para[ngram:contains(., 'mixed')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - String result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with " + MATCH_START + "mixed" + MATCH_END + " content.")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with " + MATCH_START + "mixed" + MATCH_END + " content.")); + } query = "//para[ngram:contains(., 'content')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with mixed " + MATCH_START + "content" + MATCH_END + ".")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with mixed " + MATCH_START + "content" + MATCH_END + ".")); + } query = "//para[ngram:contains(., 'nested')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("another paragraph with " + MATCH_START + "nested" + MATCH_END + " inner elements.")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("another paragraph with " + MATCH_START + "nested" + MATCH_END + " inner elements.")); + } query = "//para[ngram:contains(., 'content') and ngram:contains(., 'mixed')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with " + MATCH_START + "mixed" + MATCH_END + " " + MATCH_START + "content" + MATCH_END + ".")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with " + MATCH_START + "mixed" + MATCH_END + " " + MATCH_START + "content" + MATCH_END + ".")); + } } } @@ -196,11 +204,13 @@ public void matchInParent() throws PermissionDeniedException, IOException, LockE final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { final String query = "//para[ngram:contains(., 'mixed')]/hi"; - final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - final String result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "mixed" + MATCH_END + "")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + final String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "mixed" + MATCH_END + "")); + } } } @@ -211,18 +221,22 @@ public void matchInAncestor() throws PermissionDeniedException, IOException, Loc final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { String query = "//para[ngram:contains(., 'nested')]/note"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - String result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "nested" + MATCH_END + " inner")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "nested" + MATCH_END + " inner")); + } query = "//para[ngram:contains(., 'nested')]//hi"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "nested" + MATCH_END + "")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "nested" + MATCH_END + "")); + } } } @@ -233,25 +247,31 @@ public void nestedIndex() throws PermissionDeniedException, IOException, LockExc final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { String query = "//para[ngram:contains(term, 'term')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - String result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("a third paragraph with " + MATCH_START + "term" + MATCH_END + ".")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("a third paragraph with " + MATCH_START + "term" + MATCH_END + ".")); + } query = "//term[ngram:contains(., 'term')]/.."; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("a third paragraph with " + MATCH_START + "term" + MATCH_END + ".")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("a third paragraph with " + MATCH_START + "term" + MATCH_END + ".")); + } query = "//term[ngram:contains(., 'term')]/ancestor::para"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("a third paragraph with " + MATCH_START + "term" + MATCH_END + ".")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("a third paragraph with " + MATCH_START + "term" + MATCH_END + ".")); + } } } @@ -262,32 +282,40 @@ public void mixedContentQueries() throws PermissionDeniedException, XPathExcepti final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { String query = "//para[ngram:contains(., 'mixed content')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - String result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with " + MATCH_START + "mixed" + MATCH_END + "" + MATCH_START + " content" + MATCH_END + ".")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("some paragraph with " + MATCH_START + "mixed" + MATCH_END + "" + MATCH_START + " content" + MATCH_END + ".")); + } query = "//para[ngram:contains(., 'with mixed content')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("some paragraph " + MATCH_START + "with " + MATCH_END + "" + MATCH_START + "mixed" + MATCH_END + "" + MATCH_START + " content" + MATCH_END + ".")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("some paragraph " + MATCH_START + "with " + MATCH_END + "" + MATCH_START + "mixed" + MATCH_END + "" + MATCH_START + " content" + MATCH_END + ".")); + } query = "//para[ngram:contains(., 'with nested')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("another paragraph " + MATCH_START + "with " + MATCH_END + "" + MATCH_START + "nested" + MATCH_END + " inner elements.")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("another paragraph " + MATCH_START + "with " + MATCH_END + "" + MATCH_START + "nested" + MATCH_END + " inner elements.")); + } query = "//para[ngram:contains(., 'with nested inner elements')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("another paragraph " + MATCH_START + "with " + MATCH_END + "" + MATCH_START + "nested" + MATCH_END + "" + MATCH_START + " inner" + MATCH_END + "" + MATCH_START + " elements" + MATCH_END + ".")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("another paragraph " + MATCH_START + "with " + MATCH_END + "" + MATCH_START + "nested" + MATCH_END + "" + MATCH_START + " inner" + MATCH_END + "" + MATCH_START + " elements" + MATCH_END + ".")); + } } } @@ -298,18 +326,22 @@ public void indexOnInnerElement() throws PermissionDeniedException, IOException, final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { String query = "//para[ngram:contains(note, 'nested inner')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - String result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("another paragraph with " + MATCH_START + "nested" + MATCH_END + "" + MATCH_START + " inner" + MATCH_END + " elements.")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("another paragraph with " + MATCH_START + "nested" + MATCH_END + "" + MATCH_START + " inner" + MATCH_END + " elements.")); + } query = "//note[ngram:contains(., 'nested inner')]/parent::para"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("another paragraph with " + MATCH_START + "nested" + MATCH_END + "" + MATCH_START + " inner" + MATCH_END + " elements.")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("another paragraph with " + MATCH_START + "nested" + MATCH_END + "" + MATCH_START + " inner" + MATCH_END + " elements.")); + } } } @@ -320,25 +352,31 @@ public void doubleMatch() throws PermissionDeniedException, XPathException, SAXE final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { String query = "//para[ngram:contains(., 'double match')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - String result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "double match" + MATCH_END + " " + MATCH_START + "double match" + MATCH_END + "")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "double match" + MATCH_END + " " + MATCH_START + "double match" + MATCH_END + "")); + } query = "//para[ngram:contains(., 'aaa aaa')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "aaa aaa" + MATCH_END + " aaa")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "aaa aaa" + MATCH_END + " aaa")); + } query = "//para[ngram:ends-with(., 'aaa aaa')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("aaa " + MATCH_START + "aaa aaa" + MATCH_END + "")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("aaa " + MATCH_START + "aaa aaa" + MATCH_END + "")); + } } } @@ -349,26 +387,33 @@ public void wildcardMatch() throws PermissionDeniedException, IOException, LockE final BrokerPool pool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "//para[ngram:wildcard-contains(., 'double.*match')]"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - String result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "double match double match" + MATCH_END + "")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "double match double match" + MATCH_END + "")); + } query = "//para[ngram:wildcard-contains(., 'paragraph.*content\\.')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("some " + MATCH_START + "paragraph with " + MATCH_END + "" + MATCH_START + "mixed" + MATCH_END + "" + MATCH_START + " content." + MATCH_END + "")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + String result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("some " + MATCH_START + "paragraph with " + MATCH_END + "" + MATCH_START + "mixed" + MATCH_END + "" + MATCH_START + " content." + MATCH_END + "")); + } String wildcardQuery = "...with.*[tn].*ele.ent[sc].*"; query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("another paragra" + MATCH_START + "ph with " + MATCH_END + "" + MATCH_START + "nested" + MATCH_END + "" + MATCH_START + " inner" + MATCH_END + "" + MATCH_START + " elements." + MATCH_END + "")); + String result; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("another paragra" + MATCH_START + "ph with " + MATCH_END + "" + MATCH_START + "nested" + MATCH_END + "" + MATCH_START + " inner" + MATCH_END + "" + MATCH_START + " elements." + MATCH_END + "")); + } final Iterable it = XPATH_ENGINE.selectNodes("//exist:match", Input.fromString(result).build()); final StringBuilder m = new StringBuilder(); @@ -380,81 +425,99 @@ public void wildcardMatch() throws PermissionDeniedException, IOException, LockE wildcardQuery = "\\*.*\\?"; query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("Where did all the " + MATCH_START + "*s go?" + MATCH_END + "")); - assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("Where did all the " + MATCH_START + "*s go?" + MATCH_END + "")); + assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); + } wildcardQuery = ".est[][?]tes."; query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "test]test" + MATCH_END + " " + MATCH_START + "test[test" + MATCH_END + " " + MATCH_START + "test?test" + MATCH_END + "")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "test]test" + MATCH_END + " " + MATCH_START + "test[test" + MATCH_END + " " + MATCH_START + "test?test" + MATCH_END + "")); + } query = "//para[ngram:wildcard-contains(., '^" + wildcardQuery + "')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "test]test" + MATCH_END + " test[test test?test")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "test]test" + MATCH_END + " test[test test?test")); + } query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "$')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("test]test test[test " + MATCH_START + "test?test" + MATCH_END + "")); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("test]test test[test " + MATCH_START + "test?test" + MATCH_END + "")); + } wildcardQuery = "^aaa.aaa$"; query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "aaacaaa" + MATCH_END + "")); - assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "aaacaaa" + MATCH_END + "")); + assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); + } wildcardQuery = ".+simple"; query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "a simple" + MATCH_END + " paragraph")); - assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "a simple" + MATCH_END + " paragraph")); + assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); + } wildcardQuery = "a s.?i.?m.?p.?l.?e.?"; query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "a simple " + MATCH_END + "paragraph")); - assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "a simple " + MATCH_END + "paragraph")); + assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); + } wildcardQuery = "a s.?i.?m.?p.?l.?e.?"; query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - result = queryResult2String(broker, seq, 0); - assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "a simple " + MATCH_END + "paragraph")); - assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + result = queryResult2String(broker, seq, 0); + assertThat(result, CompareMatcher.isIdenticalTo("" + MATCH_START + "a simple " + MATCH_END + "paragraph")); + assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); + } wildcardQuery = "b.{3,6}c"; query = "//para[ngram:wildcard-contains(., '" + wildcardQuery + "')]"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(2, seq.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(2, seq.getItemCount()); - for (int i = 0; i < 2; i++) { - result = queryResult2String(broker, seq, i); - assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); + for (int i = 0; i < 2; i++) { + result = queryResult2String(broker, seq, i); + assertThat(result, hasXPath("//exist:match", matchesRegex(wildcardQuery)).withNamespaceContext(NS_CONTEXT)); + } } } } @@ -473,13 +536,15 @@ public void smallStrings() throws PermissionDeniedException, IOException, LockEx for (int i = 0; i < strings.length; i++) { final String query = "declare namespace tei=\"http://www.tei-c.org/ns/1.0\";\n" + "//tei:p[ngram:contains(., '" + strings[i] + "')]"; - final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - final String result = queryResult2String(broker, seq, 0); - - assertThat(result, hasXPath("count(//exist:match)", equalTo(i < 2 ? "2" : "1")).withNamespaceContext(NS_CONTEXT)); - assertThat(result, hasXPath("//exist:match[text() = '" + strings[i] + "']").withNamespaceContext(NS_CONTEXT)); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + final String result = queryResult2String(broker, seq, 0); + + assertThat(result, hasXPath("count(//exist:match)", equalTo(i < 2 ? "2" : "1")).withNamespaceContext(NS_CONTEXT)); + assertThat(result, hasXPath("//exist:match[text() = '" + strings[i] + "']").withNamespaceContext(NS_CONTEXT)); + } } } } @@ -496,13 +561,15 @@ public void constructedNodes() throws PermissionDeniedException, XPathException, "for $para in //tei:p[ngram:contains(., '" + strings[i] + "')]\n" + "return\n" + " {$para}"; - final Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(1, seq.getItemCount()); - final String result = queryResult2String(broker, seq, 0); - - assertThat(result, hasXPath("count(//exist:match)", equalTo(i < 2 ? "2" : "1")).withNamespaceContext(NS_CONTEXT)); - assertThat(result, hasXPath("//exist:match[text() = '" + strings[i] + "']").withNamespaceContext(NS_CONTEXT)); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + final Sequence seq = queryResult.result; + assertNotNull(seq); + assertEquals(1, seq.getItemCount()); + final String result = queryResult2String(broker, seq, 0); + + assertThat(result, hasXPath("count(//exist:match)", equalTo(i < 2 ? "2" : "1")).withNamespaceContext(NS_CONTEXT)); + assertThat(result, hasXPath("//exist:match[text() = '" + strings[i] + "']").withNamespaceContext(NS_CONTEXT)); + } } } } diff --git a/extensions/indexes/spatial/src/test/java/org/exist/indexing/spatial/GMLIndexTest.java b/extensions/indexes/spatial/src/test/java/org/exist/indexing/spatial/GMLIndexTest.java index 5e7eeff280..b4f313539e 100644 --- a/extensions/indexes/spatial/src/test/java/org/exist/indexing/spatial/GMLIndexTest.java +++ b/extensions/indexes/spatial/src/test/java/org/exist/indexing/spatial/GMLIndexTest.java @@ -45,31 +45,16 @@ */ package org.exist.indexing.spatial; -import java.io.IOException; -import java.io.StringReader; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.Paths; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Optional; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; - import org.exist.EXistException; import org.exist.collections.Collection; import org.exist.collections.CollectionConfigurationException; import org.exist.collections.CollectionConfigurationManager; import org.exist.collections.triggers.TriggerException; +import org.exist.dom.memtree.SAXAdapter; import org.exist.dom.persistent.DocumentImpl; import org.exist.dom.persistent.LockedDocument; import org.exist.dom.persistent.NodeSet; import org.exist.indexing.spatial.AbstractGMLJDBCIndex.SpatialOperator; -import org.exist.dom.memtree.SAXAdapter; import org.exist.security.PermissionDeniedException; import org.exist.source.StringSource; import org.exist.storage.BrokerPool; @@ -88,12 +73,27 @@ import org.geotools.gml.GMLFilterGeometry; import org.geotools.gml.GMLHandlerJTS; import org.junit.*; -import org.xml.sax.*; -import org.xml.sax.helpers.XMLFilterImpl; - import org.locationtech.jts.geom.Geometry; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.XMLFilterImpl; import xyz.elemental.mediatype.MediaType; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import java.io.IOException; +import java.io.StringReader; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Optional; + import static org.junit.Assert.*; /** @@ -104,33 +104,33 @@ public class GMLIndexTest { @ClassRule public static final ExistEmbeddedServer server = new ExistEmbeddedServer(true, true); - private static final String FILES[] = { "15385-SS7886-5i1.gml" }; + private static final String FILES[] = {"15385-SS7886-5i1.gml"}; private static final XmldbURI TEST_COLLECTION_URI = XmldbURI.create("/db/test-spatial-index"); private static String COLLECTION_CONFIG = "" + - " " + - " " + - " " + - " " + - ""; + " " + + " " + + " " + + " " + + ""; String IN_MEMORY_GML = "" + - " " + - "278515.400,187060.450 278515.150,187057.950 278516.350,187057.150 " + - "278546.700,187054.000 278580.550,187050.900 278609.500,187048.100 " + - "278609.750,187051.250 278574.750,187054.650 278544.950,187057.450 " + - "278515.400,187060.450 " + - " " + - ""; - + " " + + "278515.400,187060.450 278515.150,187057.950 278516.350,187057.150 " + + "278546.700,187054.000 278580.550,187050.900 278609.500,187048.100 " + + "278609.750,187051.250 278574.750,187054.650 278544.950,187057.450 " + + "278515.400,187060.450 " + + " " + + ""; + String WKT_POLYGON = "POLYGON ((-3.7530493069563913 51.5695210244188, " + - "-3.7526220716233705 51.569500427086325, -3.752191300029012 51.569481679670055, " + - "-3.7516853221460167 51.5694586575048, -3.751687839470607 51.569430291017945, " + - "-3.752106350923544 51.56944922336166, -3.752595638781826 51.5694697950237, " + - "-3.753034464037513 51.56949156828257, -3.753052048201362 51.56949850020053, " + - "-3.7530493069563913 51.5695210244188))"; + "-3.7526220716233705 51.569500427086325, -3.752191300029012 51.569481679670055, " + + "-3.7516853221460167 51.5694586575048, -3.751687839470607 51.569430291017945, " + + "-3.752106350923544 51.56944922336166, -3.752595638781826 51.5694697950237, " + + "-3.753034464037513 51.56949156828257, -3.753052048201362 51.56949850020053, " + + "-3.7530493069563913 51.5695210244188))"; private Geometry currentGeometry; @@ -206,7 +206,7 @@ public void indexDocument() throws EXistException, CollectionConfigurationExcept final DocumentImpl doc = lockedDoc.getDocument(); PreparedStatement ps = conn.prepareStatement( - "SELECT * FROM " + GMLHSQLIndex.TABLE_NAME + " WHERE DOCUMENT_URI = ?;" + "SELECT * FROM " + GMLHSQLIndex.TABLE_NAME + " WHERE DOCUMENT_URI = ?;" ); ps.setString(1, testCollection.getURI().append(doc.getURI()).getRawCollectionPath()); ResultSet rs = ps.executeQuery(); @@ -230,7 +230,7 @@ public void indexDocument() throws EXistException, CollectionConfigurationExcept @Test public void checkIndex() throws EXistException { final BrokerPool pool = server.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { AbstractGMLJDBCIndex index = (AbstractGMLJDBCIndex) pool.getIndexManager().getIndexById(AbstractGMLJDBCIndex.ID); //Unplugged if (index != null) { @@ -242,33 +242,34 @@ public void checkIndex() throws EXistException { @Test public void scanIndex() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = server.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { final String query = - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "declare function local:key-callback($term as xs:string, $data as xs:int+) as element() { " + - " " + - " {$term}" + - " {$data[1]}" + - " {$data[2]}" + - " {$data[3]}" + - " " + - "}; " + - //"util:index-keys(//gml:*, '', local:key-callback#2, 1000, 'spatial-index')[entry/frequency > 1] ", - "util:index-keys(//gml:*, '', local:key-callback#2, 1000, 'spatial-index')"; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); - assertNotNull(queryResult.result); - assertTrue(queryResult.result.getItemCount() > 1); + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "declare function local:key-callback($term as xs:string, $data as xs:int+) as element() { " + + " " + + " {$term}" + + " {$data[1]}" + + " {$data[2]}" + + " {$data[3]}" + + " " + + "}; " + + //"util:index-keys(//gml:*, '', local:key-callback#2, 1000, 'spatial-index')[entry/frequency > 1] ", + "util:index-keys(//gml:*, '', local:key-callback#2, 1000, 'spatial-index')"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 1); + } } } @Test public void lowLevelSearch() throws EXistException, SAXException, ParserConfigurationException, SpatialIndexException, IOException { - GMLHandlerJTS geometryHandler = new GeometryHandler(); + GMLHandlerJTS geometryHandler = new GeometryHandler(); GMLFilterGeometry geometryFilter = new GMLFilterGeometry(geometryHandler); GMLFilterDocument handler = new GMLFilterDocument(geometryFilter); final BrokerPool pool = server.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { AbstractGMLJDBCIndexWorker indexWorker = (AbstractGMLJDBCIndexWorker) broker.getIndexController().getWorkerByIndexId(AbstractGMLJDBCIndex.ID); //Unplugged if (indexWorker != null) { @@ -308,725 +309,819 @@ public void lowLevelSearch() throws EXistException, SAXException, ParserConfigur @Test public void highLevelSearch() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = server.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:equals(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:equals(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:disjoint(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:disjoint(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:intersects(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:intersects(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:touches(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - //assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:touches(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + //assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:crosses(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - //assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:crosses(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + //assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:within(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:within(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:contains(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:contains(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:overlaps(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - //assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:overlaps(//gml:*, //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + //assertTrue(queryResult.result.getItemCount() > 0); + } //Tests with empty sequences query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:equals(//gml:*, ())"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:equals(//gml:*, ())"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:overlaps((), //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:overlaps((), //gml:Point[gml:coordinates[. = '278697.450,187740.900']])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(0, queryResult.result.getItemCount()); + } //In-memory test query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:equals(//gml:*, " + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:equals(//gml:*, " + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } } } @Test public void geometricProperties() throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = server.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getWKT((//gml:Polygon)[1])"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getWKT((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getWKB((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getWKB((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getMinX((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getMinX((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getMaxX((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getMaxX((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getMinY((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getMinY((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getMaxY((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getMaxY((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getCentroidX((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getCentroidX((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getCentroidY((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getCentroidY((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getArea((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getArea((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326WKT((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326WKT((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326WKB((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326WKB((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326MinX((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326MinX((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326MaxX((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326MaxX((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326MinY((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326MinY((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326MaxY((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326MaxY((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326CentroidX((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326CentroidX((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326CentroidY((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326CentroidY((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326Area((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326Area((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getSRS((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getSRS((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getGeometryType((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getGeometryType((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:isClosed((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:isClosed((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:isSimple((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:isSimple((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:isValid((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:isValid((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } //Tests with empty sequences query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getWKT(())"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getWKT(())"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(0, queryResult.result.getItemCount()); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getArea(())"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getArea(())"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(0, queryResult.result.getItemCount()); + } //In-memory tests query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getWKT(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getWKT(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getWKB(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getWKB(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getMinX(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getMinX(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getMaxX(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getMaxX(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getMinY(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getMinY(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getMaxY(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getMaxY(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getCentroidX(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getCentroidX(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getCentroidY(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getCentroidY(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getArea(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getArea(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326WKT(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326WKT(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326WKB(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326WKB(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326MinX(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326MinX(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326MaxX(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326MaxX(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326MinY(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326MinY(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326MaxY(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326MaxY(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326CentroidX(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326CentroidX(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326CentroidY(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326CentroidY(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getEPSG4326Area(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getEPSG4326Area(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getSRS(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getSRS(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getGeometryType(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getGeometryType(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:isClosed(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:isClosed(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:isSimple(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:isSimple(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:isValid(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:isValid(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } } } @Test public void gmlProducers() throws PermissionDeniedException, XPathException, EXistException, IOException { final BrokerPool pool = server.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:transform((//gml:Polygon)[1], 'EPSG:4326')"; - Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:transform((//gml:Polygon)[1], 'EPSG:4326')"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getWKT((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getWKT((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:buffer((//gml:Polygon)[1], 100)"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:buffer((//gml:Polygon)[1], 100)"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:buffer((//gml:Polygon)[1], 100, 1)"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:buffer((//gml:Polygon)[1], 100, 1)"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getBbox((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getBbox((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:convexHull((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:convexHull((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:boundary((//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:boundary((//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:intersection((//gml:Polygon)[1], (//gml:Polygon)[2])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:intersection((//gml:Polygon)[1], (//gml:Polygon)[2])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:union((//gml:Polygon)[1], (//gml:Polygon)[2])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:union((//gml:Polygon)[1], (//gml:Polygon)[2])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:difference((//gml:Polygon)[1], (//gml:Polygon)[2])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:difference((//gml:Polygon)[1], (//gml:Polygon)[2])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:symetricDifference((//gml:Polygon)[1], (//gml:Polygon)[2])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:symetricDifference((//gml:Polygon)[1], (//gml:Polygon)[2])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } //Tests with empty sequences query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:transform((), 'EPSG:4326')"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:transform((), 'EPSG:4326')"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(0, queryResult.result.getItemCount()); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getWKT(())"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getWKT(())"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(0, queryResult.result.getItemCount()); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:buffer((), 100)"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:buffer((), 100)"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(0, queryResult.result.getItemCount()); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:buffer((), 100, 1)"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:buffer((), 100, 1)"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(0, queryResult.result.getItemCount()); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getBbox(())"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getBbox(())"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(0, queryResult.result.getItemCount()); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:convexHull(())"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:convexHull(())"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(0, queryResult.result.getItemCount()); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:boundary(())"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:boundary(())"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(0, queryResult.result.getItemCount()); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:union((), ())"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertEquals(0, seq.getItemCount()); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:union((), ())"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(0, queryResult.result.getItemCount()); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:union((//gml:Polygon)[1], ())"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() == 1); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:union((//gml:Polygon)[1], ())"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() == 1); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:union((), (//gml:Polygon)[1])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() == 1); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:union((), (//gml:Polygon)[1])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() == 1); + } //In-memory tests query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:transform(" + IN_MEMORY_GML + ", 'EPSG:4326')"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:transform(" + IN_MEMORY_GML + ", 'EPSG:4326')"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:buffer(" + IN_MEMORY_GML + ", 100)"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:buffer(" + IN_MEMORY_GML + ", 100)"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:buffer(" + IN_MEMORY_GML + ", 100, 1)"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:buffer(" + IN_MEMORY_GML + ", 100, 1)"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:getBbox(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:getBbox(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:convexHull(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:convexHull(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:boundary(" + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:boundary(" + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:intersection(" + IN_MEMORY_GML + ", (//gml:Polygon)[2])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:intersection(" + IN_MEMORY_GML + ", (//gml:Polygon)[2])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:union(" + IN_MEMORY_GML + ", (//gml:Polygon)[2])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:union(" + IN_MEMORY_GML + ", (//gml:Polygon)[2])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:difference(" + IN_MEMORY_GML + ", (//gml:Polygon)[2])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:difference(" + IN_MEMORY_GML + ", (//gml:Polygon)[2])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:symetricDifference(" + IN_MEMORY_GML + ", (//gml:Polygon)[2])"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:symetricDifference(" + IN_MEMORY_GML + ", (//gml:Polygon)[2])"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:intersection((//gml:Polygon)[1]," + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:intersection((//gml:Polygon)[1]," + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:union((//gml:Polygon)[1]," + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:union((//gml:Polygon)[1]," + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:difference((//gml:Polygon)[1]," + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:difference((//gml:Polygon)[1]," + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "spatial:symetricDifference((//gml:Polygon)[1]," + IN_MEMORY_GML + ")"; - seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; - assertNotNull(seq); - assertTrue(seq.getItemCount() > 0); + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "spatial:symetricDifference((//gml:Polygon)[1]," + IN_MEMORY_GML + ")"; + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.getItemCount() > 0); + } } - } + } @Ignore("Spatial Index does not currently work with XQuery Update / XUpdate") @Test public void update() throws PermissionDeniedException, XPathException, EXistException, IOException { final BrokerPool pool = server.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { String query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "(# exist:force-index-use #) { " + - "spatial:getArea((//gml:Polygon)[1]) " + - "}"; + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "(# exist:force-index-use #) { " + + "spatial:getArea((//gml:Polygon)[1]) " + + "}"; Sequence seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() == 1); final String area1 = seq.toString(); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "update value (//gml:Polygon)[1]/gml:outerBoundaryIs/gml:LinearRing/gml:coordinates " + - "(: strip decimals :) " + - "with fn:replace((//gml:Polygon)[1], '(\\d+).(\\d+)', '$1')"; + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "update value (//gml:Polygon)[1]/gml:outerBoundaryIs/gml:LinearRing/gml:coordinates " + + "(: strip decimals :) " + + "with fn:replace((//gml:Polygon)[1], '(\\d+).(\\d+)', '$1')"; seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertEquals(0, seq.getItemCount()); query = "import module namespace spatial='http://exist-db.org/xquery/spatial' " + - "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + - "declare namespace gml = 'http://www.opengis.net/gml'; " + - "(# exist:force-index-use #) { " + - "spatial:getArea((//gml:Polygon)[1]) " + - "}"; + "at 'java:org.exist.xquery.modules.spatial.SpatialModule'; " + + "declare namespace gml = 'http://www.opengis.net/gml'; " + + "(# exist:force-index-use #) { " + + "spatial:getArea((//gml:Polygon)[1]) " + + "}"; seq = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; assertNotNull(seq); assertTrue(seq.getItemCount() == 1); diff --git a/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/LazyCacheTest.java b/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/LazyCacheTest.java index 45519468c1..9937100645 100644 --- a/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/LazyCacheTest.java +++ b/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/LazyCacheTest.java @@ -56,7 +56,6 @@ import org.exist.xquery.XPathException; import org.exist.xquery.XQueryContext; import org.exist.xquery.XQueryUtil; -import org.exist.xquery.value.Sequence; import org.junit.ClassRule; import org.junit.Test; @@ -94,17 +93,19 @@ public void putOnLazilyCreatedCache() throws XPathException, PermissionDeniedExc assertEquals("true", enableLazyCreation.get(0).toString()); // 2. try and put on a cache that can be lazing created (due to conf file setting) - Sequence result = executeQuery("cache:put('lazy-foo', 'bar', 'baz1')"); - assertNotNull(result); - assertTrue(result.isEmpty()); + try (final XQueryUtil.QueryResult queryResult = executeQuery("cache:put('lazy-foo', 'bar', 'baz1')")) { + assertNotNull(queryResult.result); + assertTrue(queryResult.result.isEmpty()); + } - result = executeQuery("cache:put('lazy-foo', 'bar', 'baz2')"); - assertNotNull(result); - assertEquals(1, result.getItemCount()); - assertEquals("baz1", result.itemAt(0).getStringValue()); + try (final XQueryUtil.QueryResult queryResult = executeQuery("cache:put('lazy-foo', 'bar', 'baz2')")) { + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + assertEquals("baz1", queryResult.result.itemAt(0).getStringValue()); + } } - private static Sequence executeQuery(final String query) throws EXistException, PermissionDeniedException, XPathException, IOException { + private static XQueryUtil.QueryResult executeQuery(final String query) throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool brokerPool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = brokerPool.getBroker(); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { @@ -113,7 +114,7 @@ private static Sequence executeQuery(final String query) throws EXistException, transaction.commit(); - return queryResult.result; + return queryResult; } } } diff --git a/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/NonLazyCacheTest.java b/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/NonLazyCacheTest.java index e3bdefaf7e..4fd966c43a 100644 --- a/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/NonLazyCacheTest.java +++ b/extensions/modules/cache/src/test/java/org/exist/xquery/modules/cache/NonLazyCacheTest.java @@ -57,7 +57,6 @@ import org.exist.xquery.XPathException; import org.exist.xquery.XQueryContext; import org.exist.xquery.XQueryUtil; -import org.exist.xquery.value.Sequence; import org.junit.ClassRule; import org.junit.Test; @@ -96,15 +95,16 @@ public void putOnNonLazilyCreatedCacheWithoutExplicitCreation() throws Permissio // 2. try and put on a cache that can't be lazing created (due to conf file setting) try { - executeQuery("cache:put('non-lazy-foo', 'bar', 'baz1')"); - fail("Should not be able to lazily create a cache when lazy creation is disabled"); + try (final XQueryUtil.QueryResult queryResult = executeQuery("cache:put('non-lazy-foo', 'bar', 'baz1')")) { + fail("Should not be able to lazily create a cache when lazy creation is disabled"); + } } catch (final XPathException e) { final ErrorCodes.ErrorCode errorCode = e.getErrorCode(); assertEquals("Expected lazy creation disabled error", CacheModule.CacheModuleErrorCode.LAZY_CREATION_DISABLED.getErrorCode(), errorCode); } } - private static Sequence executeQuery(final String query) throws EXistException, PermissionDeniedException, XPathException, IOException { + private static XQueryUtil.QueryResult executeQuery(final String query) throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool brokerPool = existEmbeddedServer.getBrokerPool(); try (final DBBroker broker = brokerPool.getBroker(); final Txn transaction = brokerPool.getTransactionManager().beginTransaction()) { @@ -113,7 +113,7 @@ private static Sequence executeQuery(final String query) throws EXistException, transaction.commit(); - return queryResult.result; + return queryResult; } } } diff --git a/extensions/modules/expathrepo/expathrepo-trigger-test/src/test/java/org/exist/repo/ExampleModuleTest.java b/extensions/modules/expathrepo/expathrepo-trigger-test/src/test/java/org/exist/repo/ExampleModuleTest.java index 0a7a8a69cb..7ef8ea0cee 100644 --- a/extensions/modules/expathrepo/expathrepo-trigger-test/src/test/java/org/exist/repo/ExampleModuleTest.java +++ b/extensions/modules/expathrepo/expathrepo-trigger-test/src/test/java/org/exist/repo/ExampleModuleTest.java @@ -45,7 +45,6 @@ */ package org.exist.repo; - import org.exist.EXistException; import org.exist.security.PermissionDeniedException; import org.exist.source.StringSource; @@ -55,7 +54,6 @@ import org.exist.xquery.XPathException; import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.IntegerValue; -import org.exist.xquery.value.Sequence; import org.junit.ClassRule; import org.junit.Test; import org.w3c.dom.Document; @@ -81,19 +79,20 @@ public void helloWorld() throws XPathException, PermissionDeniedException, EXist final String query = "declare namespace myjmod = \"https://my-organisation.com/exist-db/ns/app/my-java-module\";\n" + "myjmod:hello-world()"; - final Sequence result = executeQuery(query); + try (final XQueryUtil.QueryResult queryResult = executeQuery(query)) { - assertTrue(result.hasOne()); + assertTrue(queryResult.result.hasOne()); - final Source inExpected = Input.fromString("World").build(); - final Source inActual = Input.fromDocument((Document) result.itemAt(0)).build(); + final Source inExpected = Input.fromString("World").build(); + final Source inActual = Input.fromDocument((Document) queryResult.result.itemAt(0)).build(); - final Diff diff = DiffBuilder.compare(inExpected) + final Diff diff = DiffBuilder.compare(inExpected) .withTest(inActual) .checkForSimilar() .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + assertFalse(diff.toString(), diff.hasDifferences()); + } } @Test @@ -101,19 +100,20 @@ public void sayHello() throws XPathException, PermissionDeniedException, EXistEx final String query = "declare namespace myjmod = \"https://my-organisation.com/exist-db/ns/app/my-java-module\";\n" + "myjmod:say-hello('Adam')"; - final Sequence result = executeQuery(query); + try (final XQueryUtil.QueryResult queryResult = executeQuery(query)) { - assertTrue(result.hasOne()); + assertTrue(queryResult.result.hasOne()); - final Source inExpected = Input.fromString("Adam").build(); - final Source inActual = Input.fromDocument((Document) result.itemAt(0)).build(); + final Source inExpected = Input.fromString("Adam").build(); + final Source inActual = Input.fromDocument((Document) queryResult.result.itemAt(0)).build(); - final Diff diff = DiffBuilder.compare(inExpected) + final Diff diff = DiffBuilder.compare(inExpected) .withTest(inActual) .checkForSimilar() .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + assertFalse(diff.toString(), diff.hasDifferences()); + } } @Test @@ -121,19 +121,20 @@ public void sayHello_noName() throws XPathException, PermissionDeniedException, final String query = "declare namespace myjmod = \"https://my-organisation.com/exist-db/ns/app/my-java-module\";\n" + "myjmod:say-hello(())"; - final Sequence result = executeQuery(query); + try (final XQueryUtil.QueryResult queryResult = executeQuery(query)) { - assertTrue(result.hasOne()); + assertTrue(queryResult.result.hasOne()); - final Source inExpected = Input.fromString("stranger").build(); - final Source inActual = Input.fromDocument((Document) result.itemAt(0)).build(); + final Source inExpected = Input.fromString("stranger").build(); + final Source inActual = Input.fromDocument((Document) queryResult.result.itemAt(0)).build(); - final Diff diff = DiffBuilder.compare(inExpected) + final Diff diff = DiffBuilder.compare(inExpected) .withTest(inActual) .checkForSimilar() .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + assertFalse(diff.toString(), diff.hasDifferences()); + } } @Test @@ -141,18 +142,17 @@ public void add() throws XPathException, PermissionDeniedException, EXistExcepti final String query = "declare namespace myjmod = \"https://my-organisation.com/exist-db/ns/app/my-java-module\";\n" + "myjmod:add(xs:int(123), xs:int(456))"; - final Sequence result = executeQuery(query); - - assertTrue(result.hasOne()); - - assertEquals(579, ((IntegerValue)result.itemAt(0)).getInt()); + try (final XQueryUtil.QueryResult queryResult = executeQuery(query)) { + assertTrue(queryResult.result.hasOne()); + assertEquals(579, ((IntegerValue) queryResult.result.itemAt(0)).getInt()); + } } - private Sequence executeQuery(final String query) throws EXistException, PermissionDeniedException, XPathException, IOException { + private XQueryUtil.QueryResult executeQuery(final String query) throws EXistException, PermissionDeniedException, XPathException, IOException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); - try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { - return XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null).result; + try (final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()))) { + return XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); } } } diff --git a/extensions/modules/expathrepo/src/test/java/org/exist/repo/PackageTriggerTest.java b/extensions/modules/expathrepo/src/test/java/org/exist/repo/PackageTriggerTest.java index 4c4bfed13c..4f7b50a0f7 100644 --- a/extensions/modules/expathrepo/src/test/java/org/exist/repo/PackageTriggerTest.java +++ b/extensions/modules/expathrepo/src/test/java/org/exist/repo/PackageTriggerTest.java @@ -112,8 +112,9 @@ public static void setup() throws PermissionDeniedException, SAXException, EXist // Install and deploy XAR try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject()))) { final String query = "repo:install-and-deploy-from-db('/db/" + xarFile + "')"; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); - Assert.assertEquals(1, queryResult.result.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + Assert.assertEquals(1, queryResult.result.getItemCount()); + } } // Store collection.xconf in newly created collection under /db/system/config @@ -121,8 +122,9 @@ public static void setup() throws PermissionDeniedException, SAXException, EXist final String query = "xmldb:create-collection('/db/system/config/db','trigger-test'), " + "xmldb:store('/db/system/config/db/trigger-test', '" + DEFAULT_COLLECTION_CONFIG_FILE + "', " + ")"; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); - Assert.assertEquals(2, queryResult.result.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + Assert.assertEquals(2, queryResult.result.getItemCount()); + } } } @@ -136,22 +138,25 @@ public void checkTriggerFires() throws EXistException, PermissionDeniedException // Create collection try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject()))) { final String query = "xmldb:create-collection('/db','trigger-test')"; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); - Assert.assertEquals(1, queryResult.result.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + Assert.assertEquals(1, queryResult.result.getItemCount()); + } } // Store document to fire trigger try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject()))) { final String query = "xmldb:store('/db/trigger-test', 'test.xml', b)"; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); - Assert.assertEquals(1, queryResult.result.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + Assert.assertEquals(1, queryResult.result.getItemCount()); + } } // Verify two documents are now in collection try (final DBBroker broker = brokerPool.get(Optional.of(brokerPool.getSecurityManager().getSystemSubject()))) { final String query = "xmldb:get-child-resources('/db/trigger-test')"; - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); - Assert.assertEquals("After trigger execution two documents should be in the collection.", 2, queryResult.result.getItemCount()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + Assert.assertEquals("After trigger execution two documents should be in the collection.", 2, queryResult.result.getItemCount()); + } } } diff --git a/extensions/modules/mail/src/test/java/org/exist/xquery/modules/mail/SendEmailIT.java b/extensions/modules/mail/src/test/java/org/exist/xquery/modules/mail/SendEmailIT.java index 934b977b14..0fd89c2950 100644 --- a/extensions/modules/mail/src/test/java/org/exist/xquery/modules/mail/SendEmailIT.java +++ b/extensions/modules/mail/src/test/java/org/exist/xquery/modules/mail/SendEmailIT.java @@ -585,11 +585,12 @@ private MimeMessage sendEmailBySmtpDirectConnection(final String message, @Nulla try (final DBBroker broker = pool.getBroker(); final Txn transaction = pool.getTransactionManager().beginTransaction()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { - transaction.commit(); + transaction.commit(); - assertTrue(queryResult.result.itemAt(0).toJavaObject(boolean.class)); + assertTrue(queryResult.result.itemAt(0).toJavaObject(boolean.class)); + } } // check the SMTP server received the email @@ -664,7 +665,9 @@ private MimeMessage sendEmailByJakartaMail(final String message, final String[] final Txn transaction = pool.getTransactionManager().beginTransaction()) { // execute query - XQueryUtil.query(broker, source, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, source, false, null, null, null, null, null)) { + // query result not used, but must be closed + } transaction.commit(); } diff --git a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ExecuteIT.java b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ExecuteIT.java index b7542cbe03..7d06236414 100644 --- a/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ExecuteIT.java +++ b/extensions/modules/sql/src/test/java/org/exist/xquery/modules/sql/ExecuteIT.java @@ -102,15 +102,16 @@ private void executeForNS(final String namespace, final String prefix) throws EX final Txn transaction = pool.getTransactionManager().beginTransaction()) { // execute the query - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, mainQuerySource, false, null, null, null, null, null); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, mainQuerySource, false, null, null, null, null, null)) { - // check that the namespace of the result element is in the 'sql' namespace - assertEquals(1, queryResult.result.getItemCount()); - assertTrue(queryResult.result.itemAt(0) instanceof Element); - assertEquals(Type.ELEMENT, queryResult.result.itemAt(0).getType()); - final Element element = (ElementImpl) queryResult.result.itemAt(0); - assertEquals(namespace, element.getNamespaceURI()); - assertEquals(prefix, element.getPrefix()); + // check that the namespace of the result element is in the 'sql' namespace + assertEquals(1, queryResult.result.getItemCount()); + assertTrue(queryResult.result.itemAt(0) instanceof Element); + assertEquals(Type.ELEMENT, queryResult.result.itemAt(0).getType()); + final Element element = (ElementImpl) queryResult.result.itemAt(0); + assertEquals(namespace, element.getNamespaceURI()); + assertEquals(prefix, element.getPrefix()); + } transaction.commit(); } diff --git a/extensions/modules/xslfo/src/test/java/org/exist/xquery/modules/xslfo/ApacheFopTest.java b/extensions/modules/xslfo/src/test/java/org/exist/xquery/modules/xslfo/ApacheFopTest.java index a0c793affc..9b4295ab2b 100644 --- a/extensions/modules/xslfo/src/test/java/org/exist/xquery/modules/xslfo/ApacheFopTest.java +++ b/extensions/modules/xslfo/src/test/java/org/exist/xquery/modules/xslfo/ApacheFopTest.java @@ -125,11 +125,12 @@ public void simplePdf() throws EXistException, PermissionDeniedException, XPathE final BrokerPool pool = server.getBrokerPool(); try (final DBBroker broker = pool.getBroker()) { - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null); - assertNotNull(queryResult.result); - assertEquals(1, queryResult.result.getItemCount()); - final Item pdf = queryResult.result.itemAt(0); - assertEquals(Type.BASE64_BINARY, pdf.getType()); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, new StringSource(query), false, null, null, null, null, null)) { + assertNotNull(queryResult.result); + assertEquals(1, queryResult.result.getItemCount()); + final Item pdf = queryResult.result.itemAt(0); + assertEquals(Type.BASE64_BINARY, pdf.getType()); + } } } } diff --git a/extensions/security/iprange/src/main/java/org/exist/security/realm/iprange/IPRangeRealm.java b/extensions/security/iprange/src/main/java/org/exist/security/realm/iprange/IPRangeRealm.java index 44f478af03..8296517842 100644 --- a/extensions/security/iprange/src/main/java/org/exist/security/realm/iprange/IPRangeRealm.java +++ b/extensions/security/iprange/src/main/java/org/exist/security/realm/iprange/IPRangeRealm.java @@ -139,29 +139,30 @@ public Subject authenticate(final String ipAddress, final Object credentials) th // Execute xQuery final Properties outputProperties = new Properties(); - final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, QUERY, true, null, outputProperties, null, setupXqueryContextPreExecution, null); - final SequenceIterator i = queryResult.result.iterate(); + try (final XQueryUtil.QueryResult queryResult = XQueryUtil.query(broker, QUERY, true, null, outputProperties, null, setupXqueryContextPreExecution, null)) { + final SequenceIterator i = queryResult.result.iterate(); - // Get FIRST username when present - final String username = i.hasNext() ? i.nextItem().getStringValue() : ""; + // Get FIRST username when present + final String username = i.hasNext() ? i.nextItem().getStringValue() : ""; - if (i.hasNext()) { - LOG.warn("IP address {} matched multiple ipranges. Using first result only.", ipAddress); - } + if (i.hasNext()) { + LOG.warn("IP address {} matched multiple ipranges. Using first result only.", ipAddress); + } + + if (!username.isEmpty()) { + final Account account = getSecurityManager().getAccount(username); + if (account != null) { + LOG.info("IPRangeRealm trying {}", account.getName()); + return new SubjectAccreditedImpl((AbstractAccount) account, ipAddress); + } else { + LOG.info("IPRangeRealm couldn't resolve account for {}", username); + } - if (!username.isEmpty()) { - final Account account = getSecurityManager().getAccount(username); - if (account != null) { - LOG.info("IPRangeRealm trying {}", account.getName()); - return new SubjectAccreditedImpl((AbstractAccount) account, ipAddress); } else { - LOG.info("IPRangeRealm couldn't resolve account for {}", username); + LOG.info("IPRangeRealm xquery found no matches"); } - - } else { - LOG.info("IPRangeRealm xquery found no matches"); + return null; } - return null; } catch (final EXistException | IOException | XPathException | PermissionDeniedException e) { throw new AuthenticationException(AuthenticationException.UNNOWN_EXCEPTION, e.getMessage()); From d9ab337ab3f4722f008b1518f42ec86f1f945719 Mon Sep 17 00:00:00 2001 From: Adam Retter Date: Wed, 20 May 2026 13:35:09 +0200 Subject: [PATCH 3/5] [optimize] Dispose eagerly of resources that were accumulated during XQuery exeution but are no longer needed in the Result sequence --- exist-core/pom.xml | 2 + .../exist/test/ExistXmldbEmbeddedServer.java | 4 +- .../io/FilterInputStreamCacheMonitor.java | 34 +- .../org/exist/xmldb/LocalXMLResource.java | 21 +- .../exist/xmldb/LocalXPathQueryService.java | 1 - .../main/java/org/exist/xquery/XQuery.java | 133 ++++++- .../java/org/exist/xquery/XQueryContext.java | 35 +- .../xquery/functions/array/ArrayType.java | 7 +- .../exist/xquery/functions/map/MapType.java | 9 + .../io/FilterInputStreamCacheMonitorTest.java | 370 +++++++++++++++--- 10 files changed, 531 insertions(+), 85 deletions(-) diff --git a/exist-core/pom.xml b/exist-core/pom.xml index 9271ddc021..8e983645cb 100644 --- a/exist-core/pom.xml +++ b/exist-core/pom.xml @@ -1134,6 +1134,7 @@ src/test/java/org/exist/util/io/ByteArrayContentTest.java src/main/java/org/exist/util/io/ContentFile.java src/main/java/org/exist/util/io/ContentFilePoolObjectFactory.java + src/main/java/org/exist/util/io/FilterInputStreamCacheMonitor.java src/test/java/org/exist/util/io/FilterInputStreamCacheMonitorTest.java src/test/java/org/exist/util/io/OverflowToDiskStreamTest.java src/main/java/org/exist/util/io/VirtualTempPath.java @@ -1953,6 +1954,7 @@ src/test/java/org/exist/util/io/ByteArrayContentTest.java src/main/java/org/exist/util/io/ContentFile.java src/main/java/org/exist/util/io/ContentFilePoolObjectFactory.java + src/main/java/org/exist/util/io/FilterInputStreamCacheMonitor.java src/test/java/org/exist/util/io/FilterInputStreamCacheMonitorTest.java src/test/java/org/exist/util/io/OverflowToDiskStreamTest.java src/main/java/org/exist/util/io/VirtualTempPath.java diff --git a/exist-core/src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java b/exist-core/src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java index b6151ec84e..6622f2e723 100644 --- a/exist-core/src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java +++ b/exist-core/src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java @@ -47,6 +47,7 @@ import org.exist.EXistException; import org.exist.TestUtils; +import org.exist.source.StringSource; import org.exist.storage.serializers.EXistOutputKeys; import org.exist.util.DatabaseConfigurationException; import org.exist.xmldb.EXistCollection; @@ -199,8 +200,7 @@ private void stopXmlDb() throws XMLDBException { public ResourceSet executeQuery(final String query) throws XMLDBException { - final CompiledExpression compiledQuery = xpathQueryService.compile(query); - return xpathQueryService.execute(compiledQuery); + return xpathQueryService.execute(new StringSource(query)); } public ResourceSet executeQuery(final String query, final Map externalVariables) diff --git a/exist-core/src/main/java/org/exist/util/io/FilterInputStreamCacheMonitor.java b/exist-core/src/main/java/org/exist/util/io/FilterInputStreamCacheMonitor.java index ad0772e545..bb6256fbb7 100644 --- a/exist-core/src/main/java/org/exist/util/io/FilterInputStreamCacheMonitor.java +++ b/exist-core/src/main/java/org/exist/util/io/FilterInputStreamCacheMonitor.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -19,7 +43,6 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - package org.exist.util.io; import java.util.*; @@ -44,15 +67,6 @@ public static FilterInputStreamCacheMonitor getInstance() { return INSTANCE; } - /** - * Intentionally package private! - * - * Only for use by org.exist.util.io.FilterInputStreamCacheMonitorTest - */ - void clear() { - activeCaches.clear(); - } - public void register(final FilterInputStreamCache cache) { final long now = System.currentTimeMillis(); final FilterInputStreamCacheInfo info = new FilterInputStreamCacheInfo(now, cache); diff --git a/exist-core/src/main/java/org/exist/xmldb/LocalXMLResource.java b/exist-core/src/main/java/org/exist/xmldb/LocalXMLResource.java index c889e79419..3a2244a5b1 100644 --- a/exist-core/src/main/java/org/exist/xmldb/LocalXMLResource.java +++ b/exist-core/src/main/java/org/exist/xmldb/LocalXMLResource.java @@ -86,6 +86,7 @@ import org.exist.util.serializer.SerializerPool; import org.exist.xquery.XPathException; import org.exist.xquery.value.AtomicValue; +import org.exist.xquery.value.Item; import org.exist.xquery.value.NodeValue; import org.exist.xquery.value.StringValue; import org.exist.xquery.value.Type; @@ -219,7 +220,25 @@ else if (root != null && !(root instanceof NodeValue)) { return content; } } - + + /** + * Allows access to the underlying XDM typed value. + * Should be used sparingly! + * + * @return the Underlying Xdm value. + */ + public @Nullable Item getContentAsXdm() { + if (root instanceof NodeValue) { + return (NodeValue) root; + } + + if (value != null) { + return value; + } + + return null; + } + @Override public void getContentAsStream(OutputStream os) throws XMLDBException { try { diff --git a/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java b/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java index 8dfab7434b..920c8c566a 100644 --- a/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java +++ b/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java @@ -70,7 +70,6 @@ import org.exist.xquery.XQueryContext; import org.exist.xquery.XQueryUtil; import org.exist.xquery.value.AnyURIValue; -import org.exist.xquery.value.BinaryValue; import org.exist.xquery.value.Sequence; import org.w3c.dom.Node; import org.xmldb.api.base.*; diff --git a/exist-core/src/main/java/org/exist/xquery/XQuery.java b/exist-core/src/main/java/org/exist/xquery/XQuery.java index 5239c3364d..3d85347bb4 100644 --- a/exist-core/src/main/java/org/exist/xquery/XQuery.java +++ b/exist-core/src/main/java/org/exist/xquery/XQuery.java @@ -51,6 +51,7 @@ import java.io.*; import java.text.NumberFormat; +import java.util.Iterator; import java.util.List; import java.util.Optional; import java.util.Properties; @@ -71,11 +72,16 @@ import org.exist.source.Source; import org.exist.source.StringSource; import org.exist.storage.DBBroker; +import org.exist.xquery.functions.array.ArrayType; +import org.exist.xquery.functions.map.MapType; import org.exist.xquery.parser.XQueryLexer; import org.exist.xquery.parser.XQueryParser; import org.exist.xquery.parser.XQueryTreeParser; import org.exist.xquery.util.ExpressionDumper; +import org.exist.xquery.value.BinaryValue; +import org.exist.xquery.value.Item; import org.exist.xquery.value.Sequence; +import org.exist.xquery.value.SequenceIterator; import javax.annotation.Nullable; @@ -431,6 +437,7 @@ public Sequence execute(final DBBroker broker, final CompiledXQuery expression, context.getProfiler().traceQueryStart(); broker.getBrokerPool().getProcessMonitor().queryStarted(context.getWatchDog()); + @Nullable Sequence result = null; FunctionCall call = null; try { @@ -441,7 +448,6 @@ public Sequence execute(final DBBroker broker, final CompiledXQuery expression, } } - final Sequence result; if (expression instanceof LibraryModuleRoot) { if (functionCall == null) { if (expression != null) { @@ -486,11 +492,13 @@ public Sequence execute(final DBBroker broker, final CompiledXQuery expression, broker.getBrokerPool().getProcessMonitor().queryCompleted(context.getWatchDog()); expression.reset(); - if (call != null) { + if(call != null) { call.reset(); } - if(resetContext) { + runCleanupTasks(context, result); + + if (resetContext) { context.reset(); } } @@ -518,12 +526,6 @@ public Sequence execute(final DBBroker broker, final String expression, final Se final XQueryContext context = new XQueryContext(broker.getBrokerPool()); final CompiledXQuery compiled = compile(context, expression); return execute(broker, compiled, contextSequence); - // NOTE(AR) we might consider the below cleanup, but what if a binary value is needed from the result sequence? -// try { -// return execute(broker, compiled, contextSequence); -// } finally { -// context.runCleanupTasks(); -// } } /** @@ -542,11 +544,112 @@ public Sequence execute(final DBBroker broker, final File file, final Sequence c final XQueryContext context = new XQueryContext(broker.getBrokerPool()); final CompiledXQuery compiled = compile(context, new FileSource(file.toPath(), true)); return execute(broker, compiled, contextSequence); - // NOTE(AR) we might consider the below cleanup, but what if a binary value is needed from the result sequence? -// try { -// return execute(broker, compiled, contextSequence); -// } finally { -// context.runCleanupTasks(); -// } + } + + /** + * Runs cleanup tasks after query execution to free any resources that are no longer needed. + * + * @param xqueryContext the XQuery Context. + * @param queryResult the result Sequence of the Query. + */ + private static void runCleanupTasks(final XQueryContext xqueryContext, @Nullable final Sequence queryResult) { + if (queryResult == null) { + // There are no results produced by the query, so we can cleanup everything + xqueryContext.runCleanupTasks(); + + } else { + // There are results produced, so we can only cleanup resources that don't appear in the result sequence + cleanupOrphanedValues(xqueryContext, queryResult); + } + } + + /** + * Runs cleanup tasks that cleanup items that do not appear in the Query Result. + * At present the only items that may need to be cleaned up are BinaryValue types. + * + * @param xqueryContext the XQuery Context. + * @param queryResult the result Sequence of the Query. + */ + private static void cleanupOrphanedValues(final XQueryContext xqueryContext, final Sequence queryResult) { + xqueryContext.runCleanupTasks(false, false, clazz -> clazz.equals(XQueryContext.BinaryValueCleanupTask.class), obj -> { + if (obj instanceof BinaryValue) { + final boolean hasReference = sequenceHasItemReference(queryResult, obj); + return !hasReference; + } + + return true; + }); + } + + /** + * Checks if a Sequence contains an Item. + * The check is performed by reference equality. + * + * @param sequence the Sequence to inspect. + * @param itemReference The item to look for by reference. + * + * @return true if the sequence contains the item, false otherwise. + */ + private static boolean sequenceHasItemReference(final Sequence sequence, final Object itemReference) { + if (sequence instanceof MapType) { + return itemHasItemReference((MapType) sequence, itemReference); + } + + if (sequence instanceof ArrayType) { + return itemHasItemReference((ArrayType) sequence, itemReference); + } + + try { + final SequenceIterator itItem = sequence.iterate(); + while (itItem.hasNext()) { + final Item item = itItem.nextItem(); + if (itemHasItemReference(item, itemReference)) { + return true; + } + } + } catch (final XPathException e) { + // no-op + } + + return false; + } + + /** + * Checks if an Item matches an Item (by reference equality). + * If the Item is a Map or Array, we also checks its members (recursively). + * + * @param item the Item to inspect. + * @param itemReference The item to look for by reference. + * + * @return true if the Item matches or contains the Item reference, false otherwise. + */ + private static boolean itemHasItemReference(final Item item, final Object itemReference) { + if (item == itemReference) { + return true; + } + + if (item instanceof MapType) { + final MapType mapType = (MapType) item; + final Iterator itMapValues = mapType.valueIterator(); + while (itMapValues.hasNext()) { + final Sequence mapValue = itMapValues.next(); + if (sequenceHasItemReference(mapValue, itemReference)) { + return true; + } + } + } + + if (item instanceof ArrayType) { + final ArrayType arrayType = (ArrayType) item; + final Iterator itArrayValues = arrayType.iterator(); + while (itArrayValues.hasNext()) { + final Sequence arrayValue = itArrayValues.next(); + if (sequenceHasItemReference(arrayValue, itemReference)) { + return true; + } + } + } + + return false; } } diff --git a/exist-core/src/main/java/org/exist/xquery/XQueryContext.java b/exist-core/src/main/java/org/exist/xquery/XQueryContext.java index 5502cbd1f6..289769ec4f 100644 --- a/exist-core/src/main/java/org/exist/xquery/XQueryContext.java +++ b/exist-core/src/main/java/org/exist/xquery/XQueryContext.java @@ -3460,7 +3460,7 @@ public void registerBinaryValueInstance(final BinaryValue binaryValue) { } /** - * Cleanup Task which is responsible for relasing the streams + * Cleanup Task which is responsible for releasing the streams * of any {@link BinaryValue} which have been used during * query execution */ @@ -3588,7 +3588,19 @@ public interface CleanupTask { @Override public void runCleanupTasks(final Predicate predicate) { - if (importedContextsCleanupTasksFns != null) { + runCleanupTasks(true, true, (clazz) -> true, predicate); + } + + /** + * Run cleanup tasks. + * + * @param runImportedContextsCleanupTasks true if cleanup tasks for imported contexts should be run. + * @param clearCleanupTasks true if after cleanup tasks have run they should be cleared. + * @param cleanupTaskFilter a predicate to selectively choose which cleanup tasks are run. + * @param predicate a predicate to determine what objects should be cleaned up by the cleanup tasks. + */ + public void runCleanupTasks(final boolean runImportedContextsCleanupTasks, final boolean clearCleanupTasks, final Predicate> cleanupTaskFilter, final Predicate predicate) { + if (runImportedContextsCleanupTasks && importedContextsCleanupTasksFns != null) { for (final Consumer> importedContextsCleanupTasksFn : importedContextsCleanupTasksFns) { importedContextsCleanupTasksFn.accept(predicate); } @@ -3596,15 +3608,20 @@ public void runCleanupTasks(final Predicate predicate) { } for (final CleanupTask cleanupTask : cleanupTasks) { - try { - cleanupTask.cleanup(this, predicate); - } catch (final Throwable t) { - LOG.error("Cleaning up XQueryContext: Ignoring: {}", t.getMessage(), t); + if (cleanupTaskFilter.test(cleanupTask.getClass())) { + try { + cleanupTask.cleanup(this, predicate); + } catch (final Throwable t) { + LOG.error("Cleaning up XQueryContext: Ignoring: {}", t.getMessage(), t); + } } } - // now it is safe to clear the cleanup tasks list as we know they have run - // do not move this anywhere else - cleanupTasks.clear(); + + if (clearCleanupTasks) { + // now it is safe to clear the cleanup tasks list as we know they have run + // do not move this anywhere else + cleanupTasks.clear(); + } } @Immutable diff --git a/exist-core/src/main/java/org/exist/xquery/functions/array/ArrayType.java b/exist-core/src/main/java/org/exist/xquery/functions/array/ArrayType.java index b8986401c6..da39c85e38 100644 --- a/exist-core/src/main/java/org/exist/xquery/functions/array/ArrayType.java +++ b/exist-core/src/main/java/org/exist/xquery/functions/array/ArrayType.java @@ -64,7 +64,7 @@ * * @author Wolf */ -public class ArrayType extends FunctionReference implements Lookup.LookupSupport { +public class ArrayType extends FunctionReference implements Iterable, Lookup.LookupSupport { // the signature of the function which is evaluated if the map is called as a function item private static final FunctionSignature ACCESSOR = @@ -267,6 +267,11 @@ public Sequence[] toArray() { return (Sequence[]) RT.seqToPassedArray(vector.seq(), array); } + @Override + public Iterator iterator() { + return new SeqIterator<>(vector.seq()); + } + public int getSize() { return vector.length(); } diff --git a/exist-core/src/main/java/org/exist/xquery/functions/map/MapType.java b/exist-core/src/main/java/org/exist/xquery/functions/map/MapType.java index b07ac009fa..4a72e064aa 100644 --- a/exist-core/src/main/java/org/exist/xquery/functions/map/MapType.java +++ b/exist-core/src/main/java/org/exist/xquery/functions/map/MapType.java @@ -331,6 +331,15 @@ public Iterator> iterator() { return map.iterator(); } + /** + * Get an iterator over the values in the Map. + * + * @return an iterator over the values in the map. + */ + public Iterator valueIterator() { + return map.values().iterator(); + } + @Override public AtomicValue key() { if (map.size() > 0) { diff --git a/exist-core/src/test/java/org/exist/util/io/FilterInputStreamCacheMonitorTest.java b/exist-core/src/test/java/org/exist/util/io/FilterInputStreamCacheMonitorTest.java index bd667bfc50..4bad64b422 100644 --- a/exist-core/src/test/java/org/exist/util/io/FilterInputStreamCacheMonitorTest.java +++ b/exist-core/src/test/java/org/exist/util/io/FilterInputStreamCacheMonitorTest.java @@ -45,51 +45,64 @@ */ package org.exist.util.io; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import net.jpountz.xxhash.XXHash64; +import net.jpountz.xxhash.XXHashFactory; import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.xmldb.EXistResource; import org.exist.xmldb.ExtendedResource; import org.exist.xmldb.LocalBinaryResource; +import org.exist.xmldb.LocalXMLResource; +import org.exist.xquery.XPathException; +import org.exist.xquery.functions.map.MapType; import org.exist.xquery.value.BinaryValue; +import org.exist.xquery.value.Item; +import org.exist.xquery.value.Sequence; +import org.exist.xquery.value.StringValue; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; +import org.w3c.dom.Element; +import org.w3c.dom.Node; import org.xmldb.api.base.Collection; import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; +import org.xmldb.api.modules.XMLResource; +import java.io.IOException; import java.net.URISyntaxException; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Base64; import static org.junit.Assert.*; public class FilterInputStreamCacheMonitorTest { @ClassRule - public static ExistXmldbEmbeddedServer existXmldbEmbeddedServer = new ExistXmldbEmbeddedServer(false, true, true); + public static final ExistXmldbEmbeddedServer existXmldbEmbeddedServer = new ExistXmldbEmbeddedServer(false, true, true); - protected final static Logger LOG = LogManager.getLogger(FilterInputStreamCacheMonitorTest.class); - - private static String TEST_COLLECTION_NAME = "testFilterInputStreamCacheMonitor"; + private static final String EOL = System.getProperty("line.separator"); + private static final String TEST_COLLECTION_NAME = "testFilterInputStreamCacheMonitor"; + private static final XXHash64 XXHASH64 = XXHashFactory.fastestInstance().hash64(); + private static final long XXHASH64_SEED = 0x6429e31a; + private static long EXPECTED_ICON_HASH = -1; @BeforeClass - public static void setup() throws XMLDBException, URISyntaxException { + public static void setup() throws XMLDBException, URISyntaxException, IOException { final FilterInputStreamCacheMonitor monitor = FilterInputStreamCacheMonitor.getInstance(); - int activeCount = monitor.getActive().size(); - if (activeCount != 0) { - LOG.warn("FilterInputStreamCacheMonitor should have no active binaries, but found: {}.{}{}It is likely that a previous test or process within the same JVM is leaking file handles! This should be investigated...", activeCount, System.getProperty("line.separator"), monitor.dump()); - } - monitor.clear(); + final int activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + ". It is likely that a previous test or process within the same JVM is leaking file handles! This should be investigated. Dump: " + monitor.dump(), 0, activeCount); final Path icon = Paths.get(FilterInputStreamCacheMonitorTest.class.getResource("icon.png").toURI()); + final byte[] iconBytes = Files.readAllBytes(icon); + EXPECTED_ICON_HASH = XXHASH64.hash(iconBytes, 0, iconBytes.length, XXHASH64_SEED); final Collection testCollection = existXmldbEmbeddedServer.createCollection(existXmldbEmbeddedServer.getRoot(), TEST_COLLECTION_NAME); - try(final EXistResource resource = (EXistResource)testCollection.createResource("icon.png", BinaryResource.class)) { + try (final EXistResource resource = (EXistResource) testCollection.createResource("icon.png", BinaryResource.class)) { resource.setContent(icon); testCollection.storeResource(resource); } @@ -103,82 +116,88 @@ public static void cleanup() throws XMLDBException { } @Test - public void binaryResult() throws XMLDBException { + public void binaryResult() throws XMLDBException, XPathException { final FilterInputStreamCacheMonitor monitor = FilterInputStreamCacheMonitor.getInstance(); // assert no binaries in use yet int activeCount = monitor.getActive().size(); - if (activeCount != 0) { - fail("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + System.getProperty("line.separator") + monitor.dump()); - } + assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); ResourceSet resourceSet = null; try { - resourceSet = existXmldbEmbeddedServer.executeQuery( - "util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')"); + resourceSet = existXmldbEmbeddedServer.executeQuery("util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')"); assertEquals(1, resourceSet.getSize()); - try (final EXistResource resource = (EXistResource)resourceSet.getResource(0)) { + try (final EXistResource resource = (EXistResource) resourceSet.getResource(0)) { assertTrue(resource instanceof LocalBinaryResource); - assertTrue(((ExtendedResource)resource).getExtendedContent() instanceof BinaryValue); - // one active binary (as it is in the result set) + // assert that there is one active binary (as it is in the result set) assertEquals(1, monitor.getActive().size()); + + // check the value of the retrieved binary + final Object extendedContent = ((ExtendedResource) resource).getExtendedContent(); + assertTrue(extendedContent instanceof BinaryValue); + + final BinaryValue binaryValue = (BinaryValue) extendedContent; + final byte[] retrievedIconBytes = binaryValue.toJavaObject(byte[].class); + final long retrievedIconHash = XXHASH64.hash(retrievedIconBytes, 0, retrievedIconBytes.length, XXHASH64_SEED); + assertEquals(EXPECTED_ICON_HASH, retrievedIconHash); } - // assert no active binaries as we just closed the resource in the try-with-resources + // assert no active binaries as we just closed the binary resource in the try-with-resources activeCount = monitor.getActive().size(); - if (activeCount != 0) { - fail("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + System.getProperty("line.separator") + monitor.dump()); - } + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } finally { resourceSet.clear(); } + + // final assert no active binaries as we just cleared the resource-set + activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } @Test - public void enclosedExpressionCleanup() throws XMLDBException { + public void singleElementEnclosedExprBinaryValueStringResult() throws XMLDBException { final FilterInputStreamCacheMonitor monitor = FilterInputStreamCacheMonitor.getInstance(); // assert no binaries in use yet int activeCount = monitor.getActive().size(); - if (activeCount != 0) { - fail("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + System.getProperty("line.separator") + monitor.dump()); - } + assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); ResourceSet resourceSet = null; try { resourceSet = existXmldbEmbeddedServer.executeQuery( "let $embedded := {util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')}\n" + - "return xmldb:store('/db/" + TEST_COLLECTION_NAME + "', 'icon.xml', $embedded)"); + "return\n" + + "xmldb:store('/db/" + TEST_COLLECTION_NAME + "', 'icon.xml', $embedded)"); assertEquals(1, resourceSet.getSize()); - try (final EXistResource resource = (EXistResource)resourceSet.getResource(0)) { + try (final EXistResource resource = (EXistResource) resourceSet.getResource(0)) { assertFalse(resource instanceof LocalBinaryResource); - // assert still no active binaries (because they have been cleaned up) + // assert still no active binaries (because they have been cleaned up - see XQueryContext#exitEnclosedExpr()) activeCount = monitor.getActive().size(); - if (activeCount != 0) { - fail("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + System.getProperty("line.separator") + monitor.dump()); - } + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } } finally { resourceSet.clear(); } + + // final assert no active binaries as we just cleared the resource-set + activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } @Test - public void enclosedExpressionsCleanup() throws XMLDBException { + public void multipleElementsEnclosedExprBinaryValueStringResult() throws XMLDBException { final FilterInputStreamCacheMonitor monitor = FilterInputStreamCacheMonitor.getInstance(); // assert no binaries in use yet int activeCount = monitor.getActive().size(); - if (activeCount != 0) { - fail("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + System.getProperty("line.separator") + monitor.dump()); - } + assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); ResourceSet resourceSet = null; try { @@ -186,21 +205,280 @@ public void enclosedExpressionsCleanup() throws XMLDBException { "let $bin := util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')\n" + "let $embedded := {$bin}\n" + "let $embedded-2 := {$bin}\n" + - "return xmldb:store('/db/" + TEST_COLLECTION_NAME + "', 'icon.xml', $embedded)"); + "return\n" + + "xmldb:store('/db/" + TEST_COLLECTION_NAME + "', 'icon.xml', $embedded)"); assertEquals(1, resourceSet.getSize()); - try (final EXistResource resource = (EXistResource)resourceSet.getResource(0)) { + try (final EXistResource resource = (EXistResource) resourceSet.getResource(0)) { + assertFalse(resource instanceof LocalBinaryResource); + + // assert still no active binaries (because they have been cleaned up - see XQueryContext#exitEnclosedExpr()) + activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + } + + } finally { + resourceSet.clear(); + } + + // final assert no active binaries as we just cleared the resource-set + activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + } + + @Test + public void singleElementEnclosedExprBinaryValueElementResult() throws XMLDBException { + final FilterInputStreamCacheMonitor monitor = FilterInputStreamCacheMonitor.getInstance(); + + // assert no binaries in use yet + int activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + + ResourceSet resourceSet = null; + try { + resourceSet = existXmldbEmbeddedServer.executeQuery("{util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')}"); + + assertEquals(1, resourceSet.getSize()); + try (final EXistResource resource = (EXistResource) resourceSet.getResource(0)) { assertFalse(resource instanceof LocalBinaryResource); - // assert still no active binaries (because they have been cleaned up) + // assert still no active binaries (because they have been cleaned up - see XQueryContext#exitEnclosedExpr()) activeCount = monitor.getActive().size(); - if (activeCount != 0) { - fail("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + System.getProperty("line.separator" ) + monitor.dump()); - } + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + + // check the value of the retrieved binary enclosed in the element + final Node logoElement = ((XMLResource) resource).getContentAsDOM(); + assertTrue(logoElement instanceof Element); + final Node imageElement = logoElement.getFirstChild(); + assertTrue(imageElement instanceof Element); + final String textContent = imageElement.getTextContent(); + assertNotNull(textContent); + final byte[] retrievedIconBytes = Base64.getDecoder().decode(textContent); + final long retrievedIconHash = XXHASH64.hash(retrievedIconBytes, 0, retrievedIconBytes.length, XXHASH64_SEED); + assertEquals(EXPECTED_ICON_HASH, retrievedIconHash); } } finally { resourceSet.clear(); } + + // final assert no active binaries as we just cleared the resource-set + activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } + + @Test + public void multipleElementsEnclosedExprBinaryValueElementResults() throws XMLDBException { + final FilterInputStreamCacheMonitor monitor = FilterInputStreamCacheMonitor.getInstance(); + + // assert no binaries in use yet + int activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + + ResourceSet resourceSet = null; + try { + resourceSet = existXmldbEmbeddedServer.executeQuery( + "let $bin := util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')\n" + + "return\n" + + "({$bin}, {$bin})"); + + + assertEquals(2, resourceSet.getSize()); + + try (final EXistResource resource = (EXistResource) resourceSet.getResource(0)) { + assertFalse(resource instanceof LocalBinaryResource); + + // assert still no active binaries (because they have been cleaned up - see XQueryContext#exitEnclosedExpr()) + activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + + // check the value of the retrieved binary enclosed in the element + final Node logoElement = ((XMLResource) resource).getContentAsDOM(); + assertTrue(logoElement instanceof Element); + final Node imageElement = logoElement.getFirstChild(); + assertTrue(imageElement instanceof Element); + final String textContent = imageElement.getTextContent(); + assertNotNull(textContent); + final byte[] retrievedIconBytes = Base64.getDecoder().decode(textContent); + final long retrievedIconHash = XXHASH64.hash(retrievedIconBytes, 0, retrievedIconBytes.length, XXHASH64_SEED); + assertEquals(EXPECTED_ICON_HASH, retrievedIconHash); + } + + try (final EXistResource resource = (EXistResource) resourceSet.getResource(1)) { + assertFalse(resource instanceof LocalBinaryResource); + + // assert still no active binaries (because they have been cleaned up - see XQueryContext#exitEnclosedExpr()) + activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + + // check the value of the retrieved binary enclosed in the element + final Node otherElement = ((XMLResource) resource).getContentAsDOM(); + assertTrue(otherElement instanceof Element); + final String textContent = otherElement.getTextContent(); + assertNotNull(textContent); + final byte[] retrievedIconBytes = Base64.getDecoder().decode(textContent); + final long retrievedIconHash = XXHASH64.hash(retrievedIconBytes, 0, retrievedIconBytes.length, XXHASH64_SEED); + assertEquals(EXPECTED_ICON_HASH, retrievedIconHash); + } + + } finally { + resourceSet.clear(); + } + + // final assert no active binaries as we just cleared the resource-set + activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + } + + @Test + public void mapEnclosedBinaryValueMapResult() throws XMLDBException, XPathException { + final FilterInputStreamCacheMonitor monitor = FilterInputStreamCacheMonitor.getInstance(); + + // assert no binaries in use yet + int activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + + ResourceSet resourceSet = null; + try { + resourceSet = existXmldbEmbeddedServer.executeQuery( + "map { 'key1': util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png') }"); + + assertEquals(1, resourceSet.getSize()); + try (final EXistResource resource = (EXistResource) resourceSet.getResource(0)) { + assertFalse(resource instanceof LocalBinaryResource); + + // assert that there is one active binary (as it is within the Map in the result set) + assertEquals(1, monitor.getActive().size()); + + // check the value of the retrieved binary enclosed in the map + assertTrue(resource instanceof LocalXMLResource); + final Item content = ((LocalXMLResource) resource).getContentAsXdm(); + assertTrue(content instanceof MapType); + final MapType map = (MapType) content; + final Sequence value = map.get(new StringValue("key1")); + assertTrue(value instanceof BinaryValue); + final BinaryValue binaryValue = (BinaryValue) value; + final byte[] retrievedIconBytes = binaryValue.toJavaObject(byte[].class); + final long retrievedIconHash = XXHASH64.hash(retrievedIconBytes, 0, retrievedIconBytes.length, XXHASH64_SEED); + assertEquals(EXPECTED_ICON_HASH, retrievedIconHash); + } + + // assert that there is still one active binary, because closing the Resource doesn't close the binary as it is within the Map of the Resource Set + activeCount = monitor.getActive().size(); + assertEquals(1, activeCount); + + } finally { + resourceSet.clear(); + } + + // final assert no active binaries as we just cleared the resource-set + activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + } + + @Test + public void mapEnclosedBinaryValuesMapResult() throws XMLDBException, XPathException { + final FilterInputStreamCacheMonitor monitor = FilterInputStreamCacheMonitor.getInstance(); + + // assert no binaries in use yet + int activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + + ResourceSet resourceSet = null; + try { + resourceSet = existXmldbEmbeddedServer.executeQuery( + "map { 'key1': util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png'), 'key2': util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png') }"); + + assertEquals(1, resourceSet.getSize()); + try (final EXistResource resource = (EXistResource)resourceSet.getResource(0)) { + assertFalse(resource instanceof LocalBinaryResource); + + // assert that there are two active binaries (as they are within the Map in the result set) + assertEquals(2, monitor.getActive().size()); + + // check the value of the retrieved binary enclosed in the map + assertTrue(resource instanceof LocalXMLResource); + final Item content = ((LocalXMLResource) resource).getContentAsXdm(); + assertTrue(content instanceof MapType); + final MapType map = (MapType) content; + final Sequence value = map.get(new StringValue("key1")); + assertTrue(value instanceof BinaryValue); + final BinaryValue binaryValue = (BinaryValue) value; + final byte[] retrievedIconBytes = binaryValue.toJavaObject(byte[].class); + final long retrievedIconHash = XXHASH64.hash(retrievedIconBytes, 0, retrievedIconBytes.length, XXHASH64_SEED); + assertEquals(EXPECTED_ICON_HASH, retrievedIconHash); + } + + // assert that there are still two active binaries, because closing the Resource doesn't close the binaries as they are within the Map of the Resource Set + activeCount = monitor.getActive().size(); + assertEquals(2, activeCount); + + } finally { + resourceSet.clear(); + } + + // final assert no active binaries as we just cleared the resource-set + activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + } + + @Test + public void mapEnclosedMapBinaryValueMapResult() throws XMLDBException, XPathException { + final FilterInputStreamCacheMonitor monitor = FilterInputStreamCacheMonitor.getInstance(); + + // assert no binaries in use yet + int activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + + ResourceSet resourceSet = null; + try { + resourceSet = existXmldbEmbeddedServer.executeQuery( + "let $bin := util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')\n" + + "return\n" + + "map { 'key1': $bin, 'key2': map { 'key3': $bin } }"); + + assertEquals(1, resourceSet.getSize()); + try (final EXistResource resource = (EXistResource)resourceSet.getResource(0)) { + assertFalse(resource instanceof LocalBinaryResource); + + // assert that there is one active binary (as it is within the Map in the result set) + assertEquals(1, monitor.getActive().size()); + + // check the value of the retrieved binary enclosed in the map + assertTrue(resource instanceof LocalXMLResource); + final Item content = ((LocalXMLResource) resource).getContentAsXdm(); + assertTrue(content instanceof MapType); + MapType map = (MapType) content; + Sequence value = map.get(new StringValue("key1")); + assertTrue(value instanceof BinaryValue); + BinaryValue binaryValue = (BinaryValue) value; + byte[] retrievedIconBytes = binaryValue.toJavaObject(byte[].class); + long retrievedIconHash = XXHASH64.hash(retrievedIconBytes, 0, retrievedIconBytes.length, XXHASH64_SEED); + assertEquals(EXPECTED_ICON_HASH, retrievedIconHash); + + value = map.get(new StringValue("key2")); + assertTrue(value instanceof MapType); + map = (MapType) value; + + value = map.get(new StringValue("key3")); + assertTrue(value instanceof BinaryValue); + binaryValue = (BinaryValue) value; + retrievedIconBytes = binaryValue.toJavaObject(byte[].class); + retrievedIconHash = XXHASH64.hash(retrievedIconBytes, 0, retrievedIconBytes.length, XXHASH64_SEED); + assertEquals(EXPECTED_ICON_HASH, retrievedIconHash); + } + + // assert that there is still one active binary, because closing the Resource doesn't close the binary as it is within the Map of the Resource Set + activeCount = monitor.getActive().size(); + assertEquals(1, activeCount); + + } finally { + resourceSet.clear(); + } + + // final assert no active binaries as we just cleared the resource-set + activeCount = monitor.getActive().size(); + assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); + } + } From 0a21b53a8a15eaae6f5aa13438b870e2db7f4ddd Mon Sep 17 00:00:00 2001 From: Adam Retter Date: Tue, 3 Mar 2026 13:40:15 +0100 Subject: [PATCH 4/5] [bugfix] Prevent memory leaks from the XML:DB API (and by extension XML-RPC API) by ensuring that resources used in queries and retrieving documents are correctly cleaned up. See https://github.com/xmldb-org/xmldb-api/issues/251 --- build.sh | 5 +- elemental-parent/pom.xml | 4 +- exist-ant/pom.xml | 55 +- .../java/org/exist/ant/AbstractXMLDBTask.java | 111 +- .../main/java/org/exist/ant/AddGroupTask.java | 34 +- .../main/java/org/exist/ant/AddUserTask.java | 34 +- .../main/java/org/exist/ant/ChmodTask.java | 48 +- .../main/java/org/exist/ant/ChownTask.java | 43 +- .../java/org/exist/ant/ListGroupsTask.java | 34 +- .../java/org/exist/ant/ListUsersTask.java | 34 +- .../java/org/exist/ant/LockResourceTask.java | 39 +- .../java/org/exist/ant/RemoveGroupTask.java | 36 +- .../java/org/exist/ant/RemoveUserTask.java | 36 +- .../main/java/org/exist/ant/RestoreTask.java | 45 +- .../java/org/exist/ant/UserPasswordTask.java | 32 +- .../src/main/java/org/exist/ant/UserTask.java | 110 +- .../java/org/exist/ant/XMLDBCopyTask.java | 50 +- .../java/org/exist/ant/XMLDBCreateTask.java | 114 +- .../java/org/exist/ant/XMLDBExistTask.java | 38 +- .../java/org/exist/ant/XMLDBExtractTask.java | 99 +- .../java/org/exist/ant/XMLDBListTask.java | 29 +- .../java/org/exist/ant/XMLDBMoveTask.java | 49 +- .../java/org/exist/ant/XMLDBRemoveTask.java | 46 +- .../java/org/exist/ant/XMLDBShutdownTask.java | 29 +- .../java/org/exist/ant/XMLDBStoreTask.java | 370 +- .../java/org/exist/ant/XMLDBXPathTask.java | 99 +- .../java/org/exist/ant/XMLDBXQueryTask.java | 117 +- .../java/org/exist/ant/XMLDBXUpdateTask.java | 46 +- .../test/java/org/exist/ant/FileTaskTest.java | 33 +- .../java/org/exist/ant/ServerTaskTest.java | 29 +- .../java/org/exist/ant/XmldbTaskTest.java | 61 +- exist-core-jcstress/pom.xml | 2 +- exist-core-jmh/pom.xml | 2 +- exist-core/pom.xml | 170 +- .../main/java/org/exist/backup/Backup.java | 215 +- .../org/exist/backup/CreateBackupDialog.java | 47 +- .../src/main/java/org/exist/backup/Main.java | 17 +- .../java/org/exist/client/ClientFrame.java | 155 +- .../org/exist/client/CollectionXConf.java | 296 +- .../java/org/exist/client/DocumentView.java | 59 +- .../java/org/exist/client/IndexDialog.java | 72 +- .../org/exist/client/InteractiveClient.java | 748 ++-- .../org/exist/client/NewResourceDialog.java | 2 +- .../java/org/exist/client/QueryDialog.java | 39 +- .../java/org/exist/client/TriggersDialog.java | 35 +- .../client/security/EditPropertiesDialog.java | 10 +- .../java/org/exist/jetty/ServerShutdown.java | 11 +- .../exist/test/ExistXmldbEmbeddedServer.java | 38 +- .../org/exist/util/CollectionScanner.java | 28 +- .../org/exist/xmldb/EXistResourceSet.java | 37 + .../exist/xmldb/EXistXPathQueryService.java | 33 +- .../org/exist/xmldb/EXistXQueryService.java | 179 +- .../java/org/exist/xmldb/LocalCollection.java | 10 +- .../org/exist/xmldb/LocalResourceSet.java | 20 +- .../exist/xmldb/LocalXPathQueryService.java | 31 +- .../java/org/exist/xmldb/MapResourceSet.java | 32 +- .../org/exist/xmldb/RemoteCollection.java | 6 +- .../org/exist/xmldb/RemoteResourceSet.java | 8 +- .../exist/xmldb/RemoteXPathQueryService.java | 20 +- .../java/org/exist/xmlrpc/RpcConnection.java | 2 +- .../main/java/org/exist/xquery/XPathUtil.java | 6 +- .../XMLDBAbstractCollectionManipulator.java | 107 +- .../functions/xmldb/XMLDBLoadFromPattern.java | 13 +- .../java/org/exist/TestDataGenerator.java | 41 +- .../org/exist/backup/XMLDBBackupTest.java | 118 +- .../org/exist/backup/XMLDBRestoreTest.java | 74 +- .../exist/client/InteractiveClientTest.java | 50 +- .../collections/CollectionRemovalTest.java | 30 +- .../exist/collections/ConcurrencyTest.java | 64 +- .../triggers/CollectionTriggerTest.java | 54 +- .../collections/triggers/SAXTriggerTest.java | 126 +- .../triggers/TriggerConfigTest.java | 169 +- .../triggers/XQueryTrigger2Test.java | 358 +- .../triggers/XQueryTriggerTest.java | 651 ++-- ...ocumentBuilderReceiverIntegrationTest.java | 59 +- .../dom/memtree/MemtreeInXQueryTest.java | 63 +- .../dom/persistent/CDataIntergationTest.java | 14 +- .../org/exist/security/XMLDBSecurityTest.java | 2590 +++++++------ .../exist/security/XmldbApiSecurityTest.java | 150 +- .../BackupRestoreSecurityPrincipalsTest.java | 132 +- .../storage/CopyCollectionRecoveryTest.java | 112 +- .../storage/MoveCollectionRecoveryTest.java | 129 +- .../storage/MoveResourceRecoveryTest.java | 93 +- .../org/exist/storage/UpdateRecoverTest.java | 268 +- .../org/exist/storage/lock/DeadlockTest.java | 24 +- .../exist/storage/lock/ProtectedModeTest.java | 81 +- .../io/FilterInputStreamCacheMonitorTest.java | 83 +- .../CollectionConfigurationTest.java | 48 +- ...ectionConfigurationValidationModeTest.java | 39 +- .../validation/DatabaseCollectionTest.java | 62 +- .../org/exist/validation/DtdEntityTest.java | 4 +- .../exist/xmldb/BinaryResourceUpdateTest.java | 92 +- .../xmldb/CollectionConfigurationTest.java | 2361 +++++++----- .../java/org/exist/xmldb/CollectionTest.java | 31 +- .../org/exist/xmldb/ContentAsDOMTest.java | 63 +- .../java/org/exist/xmldb/CopyMoveTest.java | 164 +- .../exist/xmldb/CreateCollectionsTest.java | 255 +- .../test/java/org/exist/xmldb/DOMTest.java | 275 +- .../org/exist/xmldb/DeclareVariableTest.java | 71 +- .../org/exist/xmldb/DeleteCollectionTest.java | 74 +- .../exist/xmldb/EXistXMLSerializeTest.java | 206 +- .../java/org/exist/xmldb/IndexingTest.java | 78 +- .../org/exist/xmldb/LocalCollectionTest.java | 28 + .../exist/xmldb/LocalXMLResourceDOMTest.java | 103 +- .../org/exist/xmldb/MoveCollectionTest.java | 82 +- .../java/org/exist/xmldb/MultiDBTest.java | 83 +- .../org/exist/xmldb/RemoteCollectionTest.java | 237 +- .../java/org/exist/xmldb/RemoteDBTest.java | 65 +- .../java/org/exist/xmldb/RemoteDOMTest.java | 94 +- .../exist/xmldb/RemoteDatabaseImplTest.java | 61 +- .../java/org/exist/xmldb/RemoteQueryTest.java | 90 +- .../org/exist/xmldb/RenameCollectionTest.java | 101 +- .../java/org/exist/xmldb/ResourceSetTest.java | 75 +- .../java/org/exist/xmldb/ResourceTest.java | 400 +- .../org/exist/xmldb/SerializationTest.java | 128 +- .../java/org/exist/xmldb/ShutdownTest.java | 76 +- .../org/exist/xmldb/TreeLevelOrderTest.java | 52 +- .../xmldb/XMLDBExternalVariableTest.java | 20 +- .../concurrent/AbstractConcurrentTest.java | 9 +- .../xmldb/concurrent/ComplexUpdateTest.java | 8 +- .../concurrent/ConcurrentQueryUpdateTest.java | 21 +- .../concurrent/ConcurrentResource2Test.java | 5 +- .../concurrent/ConcurrentResourceTest.java | 7 +- .../org/exist/xmldb/concurrent/DBUtils.java | 37 +- .../exist/xmldb/concurrent/DeadlockTest.java | 38 +- .../action/AttributeUpdateAction.java | 39 +- .../action/ComplexUpdateAction.java | 76 +- .../action/CreateCollectionAction.java | 46 +- .../action/MultiResourcesAction.java | 7 +- .../concurrent/action/RemoveAppendAction.java | 35 +- .../action/ReplaceResourceAction.java | 66 +- .../action/RetrieveResourceAction.java | 35 +- .../concurrent/action/TextUpdateAction.java | 85 +- .../concurrent/action/ValueAppendAction.java | 55 +- .../xmldb/concurrent/action/XQueryAction.java | 59 +- .../concurrent/action/XQueryUpdateAction.java | 35 +- .../java/org/exist/xmlrpc/MimeTypeTest.java | 66 +- .../org/exist/xmlrpc/QuerySessionTest.java | 99 +- .../AbstractDescendantOrSelfNodeKindTest.java | 101 +- .../org/exist/xquery/AnnotationsTest.java | 99 +- .../java/org/exist/xquery/CleanupTest.java | 72 +- .../exist/xquery/ConstructedNodesTest.java | 102 +- .../org/exist/xquery/ConversionsTest.java | 48 +- .../java/org/exist/xquery/DeepEqualTest.java | 104 +- .../org/exist/xquery/DocumentUpdateTest.java | 61 +- .../exist/xquery/DuplicateAttributesTest.java | 96 +- .../java/org/exist/xquery/EntitiesTest.java | 127 +- .../org/exist/xquery/ImportFromPkgTest.java | 63 +- .../org/exist/xquery/InternalModuleTest.java | 86 +- .../MemtreeDescendantOrSelfNodeKindTest.java | 28 +- .../org/exist/xquery/NamespaceUpdateTest.java | 50 +- .../java/org/exist/xquery/NodeTypeTest.java | 40 +- .../java/org/exist/xquery/OptimizerTest.java | 83 +- ...ersistentDescendantOrSelfNodeKindTest.java | 40 +- .../java/org/exist/xquery/QueryPoolTest.java | 36 +- .../test/java/org/exist/xquery/SeqOpTest.java | 89 +- .../org/exist/xquery/SpecialNamesTest.java | 104 +- .../org/exist/xquery/StoredModuleTest.java | 106 +- .../java/org/exist/xquery/TransformTest.java | 142 +- .../test/java/org/exist/xquery/UnionTest.java | 132 +- .../exist/xquery/ValueIndexByQNameTest.java | 41 +- .../java/org/exist/xquery/ValueIndexTest.java | 355 +- .../java/org/exist/xquery/VariablesTest.java | 23 +- .../java/org/exist/xquery/WatchdogTest.java | 4 +- .../xquery/XPathOpOrSpecialCaseTest.java | 29 +- .../java/org/exist/xquery/XPathQueryTest.java | 2279 ++++++----- .../org/exist/xquery/XQueryFunctionsTest.java | 1184 +++--- .../XQueryProcessingInstructionTest.java | 12 +- .../java/org/exist/xquery/XQueryTest.java | 3407 ++++++++++------- .../org/exist/xquery/XmldbBinariesTest.java | 35 +- .../exist/xquery/functions/fn/DocTest.java | 66 +- .../exist/xquery/functions/fn/ExtDocTest.java | 50 +- .../xquery/functions/fn/FunLangTest.java | 30 +- .../xquery/functions/fn/FunNumberTest.java | 53 +- .../xquery/functions/fn/FunStrLengthTest.java | 81 +- .../functions/fn/FunSubSequenceTest.java | 156 +- .../xquery/functions/request/GetDataTest.java | 22 +- .../functions/request/GetParameterTest.java | 22 +- .../xquery/functions/request/PatchTest.java | 19 +- .../system/GetRunningXQueriesTest.java | 14 +- .../transform/TransformFromPkgTest.java | 9 +- .../functions/util/Base64FunctionsTest.java | 102 +- .../functions/util/BaseConverterTest.java | 55 +- .../exist/xquery/functions/util/EvalTest.java | 262 +- .../xquery/functions/util/ExpandTest.java | 90 +- .../validate/AdditionalJingXsdRngTest.java | 73 +- .../validate/JaxpDtdCatalogTest.java | 29 +- .../functions/validate/JaxpParseTest.java | 23 +- .../validate/JaxpXsdCatalogTest.java | 29 +- .../xquery/functions/validate/JaxvTest.java | 183 +- .../functions/validate/JingOnvdlTest.java | 47 +- .../functions/validate/JingRelaxNgTest.java | 29 +- .../validate/JingSchematronTest.java | 29 +- .../functions/validate/JingXsdTest.java | 18 +- .../xquery/functions/xmldb/DbStore2Test.java | 54 +- .../xquery/functions/xmldb/DbStoreTest.java | 46 +- .../xmldb/XMLDBAuthenticateTest.java | 15 +- .../xquery3/DeclareVariableTest.java | 36 +- .../xquery/functions/xquery3/SwitchTest.java | 54 +- .../functions/xquery3/TryCatchTest.java | 244 +- .../xquery/update/AbstractUpdateTest.java | 57 +- .../xquery/update/IndexIntegrationTest.java | 15 +- .../exist/xquery/update/UpdateInsertTest.java | 38 +- .../xquery/update/UpdateReplaceTest.java | 167 +- .../exist/xquery/update/UpdateValueTest.java | 21 +- .../exist/xquery/value/Base64BinaryTest.java | 38 +- .../org/exist/xupdate/RemoveAppendTest.java | 39 +- .../java/org/exist/xupdate/StressTest.java | 53 +- .../java/org/exist/xupdate/XUpdateTest.java | 17 +- exist-distribution/pom.xml | 18 +- exist-docker/pom.xml | 4 +- exist-xqts/pom.xml | 2 +- extensions/debuggee/pom.xml | 2 +- extensions/images/pom.xml | 2 +- extensions/indexes/lucene/pom.xml | 4 + .../indexing/lucene/ConcurrencyTest.java | 87 +- .../exist/indexing/lucene/OptimizerTest.java | 66 +- extensions/modules/counter/pom.xml | 2 + .../xquery/modules/counter/CounterTest.java | 103 +- extensions/modules/file/pom.xml | 4 + .../modules/file/AbstractBinariesTest.java | 58 +- .../modules/file/XmldbBinariesTest.java | 49 +- extensions/modules/mail/pom.xml | 2 +- .../persistentlogin/LoginModuleTest.java | 21 +- extensions/modules/sql-oracle/pom.xml | 2 +- extensions/security/ldap/pom.xml | 4 +- extensions/security/pom.xml | 2 +- extensions/xqdoc/pom.xml | 2 + .../java/org/exist/xqdoc/ant/XQDocTask.java | 106 +- 229 files changed, 17066 insertions(+), 11275 deletions(-) create mode 100644 exist-core/src/main/java/org/exist/xmldb/EXistResourceSet.java diff --git a/build.sh b/build.sh index c278cec94f..09e5c5ee20 100755 --- a/build.sh +++ b/build.sh @@ -27,6 +27,9 @@ set -e +# Uncomment below to assist in debugging +#set -x + TARGET="useage" DEBUG=false OFFLINE=false @@ -173,7 +176,7 @@ fi if [ "${TARGET}" == "format-poms" ]; then SAXON="${HOME}/.m2/repository/net/sf/saxon/Saxon-HE/9.9.1-8/Saxon-HE-9.9.1-8.jar" - POMS="$(find . -name pom.xml)" + POMS="$(find $SCRIPT_DIR -name pom.xml)" for pom in $POMS; do echo -n "Formatting ${pom} ... " diff --git a/elemental-parent/pom.xml b/elemental-parent/pom.xml index 2768f5ed7a..06879f6a41 100644 --- a/elemental-parent/pom.xml +++ b/elemental-parent/pom.xml @@ -505,7 +505,7 @@ - + ${surefire.forkCount} ${surefire.reuseForks} @{jacocoArgLine} --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.ref=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED -Dfile.encoding=${project.build.sourceEncoding} @@ -807,4 +807,4 @@ - + \ No newline at end of file diff --git a/exist-ant/pom.xml b/exist-ant/pom.xml index 592830314e..7fa8596414 100644 --- a/exist-ant/pom.xml +++ b/exist-ant/pom.xml @@ -106,7 +106,6 @@ com.google.code.findbugs jsr305 - test @@ -184,7 +183,34 @@ pom.xml src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml + src/main/java/org/exist/ant/AbstractXMLDBTask.java + src/main/java/org/exist/ant/AddGroupTask.java + src/main/java/org/exist/ant/AddUserTask.java + src/main/java/org/exist/ant/ChmodTask.java + src/main/java/org/exist/ant/ChownTask.java + src/test/java/org/exist/ant/FileTaskTest.java + src/main/java/org/exist/ant/ListGroupsTask.java + src/main/java/org/exist/ant/ListUsersTask.java + src/main/java/org/exist/ant/LockResourceTask.java + src/main/java/org/exist/ant/RemoveGroupTask.java + src/main/java/org/exist/ant/RemoveUserTask.java + src/main/java/org/exist/ant/RestoreTask.java + src/test/java/org/exist/ant/ServerTaskTest.java + src/main/java/org/exist/ant/UserPasswordTask.java + src/main/java/org/exist/ant/UserTask.java + src/main/java/org/exist/ant/XMLDBCopyTask.java + src/main/java/org/exist/ant/XMLDBCreateTask.java + src/main/java/org/exist/ant/XMLDBExistTask.java + src/main/java/org/exist/ant/XMLDBExtractTask.java + src/main/java/org/exist/ant/XMLDBListTask.java + src/main/java/org/exist/ant/XMLDBMoveTask.java + src/main/java/org/exist/ant/XMLDBRemoveTask.java + src/main/java/org/exist/ant/XMLDBShutdownTask.java src/main/java/org/exist/ant/XMLDBStoreTask.java + src/test/java/org/exist/ant/XmldbTaskTest.java + src/main/java/org/exist/ant/XMLDBXPathTask.java + src/main/java/org/exist/ant/XMLDBXQueryTask.java + src/main/java/org/exist/ant/XMLDBXUpdateTask.java @@ -202,7 +228,34 @@ xquery-license-style.xml src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml + src/main/java/org/exist/ant/AbstractXMLDBTask.java + src/main/java/org/exist/ant/AddGroupTask.java + src/main/java/org/exist/ant/AddUserTask.java + src/main/java/org/exist/ant/ChmodTask.java + src/main/java/org/exist/ant/ChownTask.java + src/test/java/org/exist/ant/FileTaskTest.java + src/main/java/org/exist/ant/ListGroupsTask.java + src/main/java/org/exist/ant/ListUsersTask.java + src/main/java/org/exist/ant/LockResourceTask.java + src/main/java/org/exist/ant/RemoveGroupTask.java + src/main/java/org/exist/ant/RemoveUserTask.java + src/main/java/org/exist/ant/RestoreTask.java + src/test/java/org/exist/ant/ServerTaskTest.java + src/main/java/org/exist/ant/UserPasswordTask.java + src/main/java/org/exist/ant/UserTask.java + src/main/java/org/exist/ant/XMLDBCopyTask.java + src/main/java/org/exist/ant/XMLDBCreateTask.java + src/main/java/org/exist/ant/XMLDBExistTask.java + src/main/java/org/exist/ant/XMLDBExtractTask.java + src/main/java/org/exist/ant/XMLDBListTask.java + src/main/java/org/exist/ant/XMLDBMoveTask.java + src/main/java/org/exist/ant/XMLDBRemoveTask.java + src/main/java/org/exist/ant/XMLDBShutdownTask.java src/main/java/org/exist/ant/XMLDBStoreTask.java + src/test/java/org/exist/ant/XmldbTaskTest.java + src/main/java/org/exist/ant/XMLDBXPathTask.java + src/main/java/org/exist/ant/XMLDBXQueryTask.java + src/main/java/org/exist/ant/XMLDBXUpdateTask.java diff --git a/exist-ant/src/main/java/org/exist/ant/AbstractXMLDBTask.java b/exist-ant/src/main/java/org/exist/ant/AbstractXMLDBTask.java index 5c49a61a91..5ec5c568fc 100644 --- a/exist-ant/src/main/java/org/exist/ant/AbstractXMLDBTask.java +++ b/exist-ant/src/main/java/org/exist/ant/AbstractXMLDBTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -37,6 +61,7 @@ import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; +import javax.annotation.Nullable; import java.util.StringTokenizer; @@ -186,79 +211,67 @@ protected void registerDatabase() throws BuildException } - protected final Collection mkcol(final Collection rootCollection, final String baseURI, String path, final String relPath ) throws XMLDBException - { - CollectionManagementService mgtService; - Collection current = rootCollection; - Collection collection; - String token; - - ///TODO : use dedicated function in XmldbURI - final StringTokenizer tokenizer = new StringTokenizer( relPath, "/" ); - - while( tokenizer.hasMoreTokens() ) { - - token = tokenizer.nextToken(); + protected final Collection mkcol(Collection collection, final String baseURI, String path, final String relPath) throws XMLDBException { + final StringTokenizer tokenizer = new StringTokenizer(relPath, "/"); - if( path != null ) { + while (tokenizer.hasMoreTokens()) { + final String token = tokenizer.nextToken(); + if (path != null) { path = path + "/" + token; } else { path = "/" + token; } - log( "Get collection " + baseURI + path, Project.MSG_DEBUG ); - collection = DatabaseManager.getCollection( baseURI + path, user, password ); - - if( collection == null ) { - log( "Create collection management service for collection " + current.getName(), Project.MSG_DEBUG ); - mgtService = current.getService( CollectionManagementService.class ); - log( "Create child collection " + token, Project.MSG_DEBUG ); - current = mgtService.createCollection( token ); - log( "Created collection " + current.getName() + '.', Project.MSG_DEBUG ); + Collection child = DatabaseManager.getCollection(baseURI + path, user, password); + if (child == null) { + final CollectionManagementService mgtService = collection.getService(CollectionManagementService.class); + log("Create child collection " + token, Project.MSG_DEBUG); + child = mgtService.createCollection(token); + log("Created collection " + child.getName() + '.', Project.MSG_DEBUG); + } - } else { - current = collection; + try { + // close the parent collection + collection.close(); + } catch (final XMLDBException e) { + // no-op } + + collection = child; } - return( current ); + + return collection; } - protected final void setPermissions(final Resource res ) throws BuildException - { - Collection base = null; - UserManagementService service = null; - - if( uri == null ) { - throw( new BuildException( "you have to specify an XMLDB collection URI" ) ); + protected final void setPermissions(final Resource res) throws BuildException { + if (uri == null) { + throw new BuildException( "you have to specify an XMLDB collection URI"); } - try { - log( "Get base collection: " + uri, Project.MSG_DEBUG ); - base = DatabaseManager.getCollection( uri, user, password ); + log("Get base collection: " + uri, Project.MSG_DEBUG); + try (final Collection base = DatabaseManager.getCollection(uri, user, password)) { - if( base == null ) { + if (base == null ) { final String msg = "Collection " + uri + " could not be found."; - if( failonerror ) { - throw( new BuildException( msg ) ); + if (failonerror) { + throw new BuildException(msg); } else { - log( msg, Project.MSG_ERR ); + log(msg, Project.MSG_ERR); } } else { - service = base.getService( UserManagementService.class); - - setPermissions( res, service ); + final UserManagementService service = base.getService(UserManagementService.class); + setPermissions(res, service); } - } - catch( final XMLDBException e ) { + } catch (final XMLDBException e) { final String msg = "XMLDB exception caught: " + e.getMessage(); - if( failonerror ) { - throw( new BuildException( msg, e ) ); + if (failonerror) { + throw new BuildException(msg, e); } else { - log( msg, e, Project.MSG_ERR ); + log(msg, e, Project.MSG_ERR); } } } @@ -283,7 +296,7 @@ protected final void setPermissions(final Collection col ) throws BuildException } - protected final void setPermissions(final Resource res, final UserManagementService service ) throws BuildException + protected final void setPermissions(@Nullable final Resource res, final UserManagementService service ) throws BuildException { try { if( permissions != null ) { diff --git a/exist-ant/src/main/java/org/exist/ant/AddGroupTask.java b/exist-ant/src/main/java/org/exist/ant/AddGroupTask.java index 9458d26ca6..7c87a0035c 100644 --- a/exist-ant/src/main/java/org/exist/ant/AddGroupTask.java +++ b/exist-ant/src/main/java/org/exist/ant/AddGroupTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -34,12 +58,8 @@ public class AddGroupTask extends UserTask { private String name; - /* (non-Javadoc) - * @see org.apache.tools.ant.Task#execute() - */ - public void execute() throws BuildException - { - super.execute(); + @Override + public void executeUserTask() throws BuildException { if( name == null ) { throw( new BuildException( "Must specify a group name" ) ); @@ -49,7 +69,7 @@ public void execute() throws BuildException final GroupAider group = new GroupAider( name ); log( "Adding group " + name, Project.MSG_INFO ); - service.addGroup( group ); + getService().addGroup( group ); } catch( final XMLDBException e ) { diff --git a/exist-ant/src/main/java/org/exist/ant/AddUserTask.java b/exist-ant/src/main/java/org/exist/ant/AddUserTask.java index b5792f8389..d9f1feb8a3 100644 --- a/exist-ant/src/main/java/org/exist/ant/AddUserTask.java +++ b/exist-ant/src/main/java/org/exist/ant/AddUserTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -37,12 +61,8 @@ public class AddUserTask extends UserTask { private String primaryGroup; private String secret; - /* (non-Javadoc) - * @see org.apache.tools.ant.Task#execute() - */ - public void execute() throws BuildException - { - super.execute(); + @Override + public void executeUserTask() throws BuildException { if( name == null ) { throw( new BuildException( "Must specify at leat a user name" ) ); @@ -60,7 +80,7 @@ public void execute() throws BuildException } log( "Adding user " + name, Project.MSG_INFO ); - service.addAccount( usr ); + getService().addAccount( usr ); } catch( final XMLDBException e ) { diff --git a/exist-ant/src/main/java/org/exist/ant/ChmodTask.java b/exist-ant/src/main/java/org/exist/ant/ChmodTask.java index c56bdecee1..ca5701d2bd 100644 --- a/exist-ant/src/main/java/org/exist/ant/ChmodTask.java +++ b/exist-ant/src/main/java/org/exist/ant/ChmodTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -38,14 +62,8 @@ public class ChmodTask extends UserTask private String resource = null; private String mode = null; - /* (non-Javadoc) - * @see org.apache.tools.ant.Task#execute() - */ - public void execute() throws BuildException - { - Resource res = null; - - super.execute(); + @Override + public void executeUserTask() throws BuildException { if( permissions == null ) { if( mode == null ) { @@ -57,11 +75,15 @@ public void execute() throws BuildException try { - if( resource != null ) { - res = base.getResource( resource ); - } - - setPermissions( res, service ); + if (resource != null) { + try (final Resource res = getBase().getResource( resource)) { + if (res != null) { + setPermissions(res, getService()); + } + } + } else { + setPermissions(null, getService()); + } } catch( final XMLDBException e ) { final String msg = "XMLDB exception caught: " + e.getMessage(); diff --git a/exist-ant/src/main/java/org/exist/ant/ChownTask.java b/exist-ant/src/main/java/org/exist/ant/ChownTask.java index 2e49e488c4..df029e3db1 100644 --- a/exist-ant/src/main/java/org/exist/ant/ChownTask.java +++ b/exist-ant/src/main/java/org/exist/ant/ChownTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -39,25 +63,24 @@ public class ChownTask extends UserTask private String group = null; private String resource = null; - /* (non-Javadoc) - * @see org.apache.tools.ant.Task#execute() - */ - public void execute() throws BuildException - { - super.execute(); + @Override + public void executeUserTask() throws BuildException { if( ( name == null ) || ( group == null ) ) { throw( new BuildException( "Must specify user and group" ) ); } try { - final Account usr = service.getAccount( name ); + final Account usr = getService().getAccount( name ); if( resource != null ) { - final Resource res = base.getResource( resource ); - service.chown( res, usr, group ); + try (final Resource res = getBase().getResource( resource )) { + if (res != null) { + getService().chown(res, usr, group); + } + } } else { - service.chown( usr, group ); + getService().chown( usr, group ); } } diff --git a/exist-ant/src/main/java/org/exist/ant/ListGroupsTask.java b/exist-ant/src/main/java/org/exist/ant/ListGroupsTask.java index 531546e13f..cf9d9c75b6 100644 --- a/exist-ant/src/main/java/org/exist/ant/ListGroupsTask.java +++ b/exist-ant/src/main/java/org/exist/ant/ListGroupsTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -36,16 +60,12 @@ public class ListGroupsTask extends UserTask private String outputproperty = null; private String separator = ","; - /* (non-Javadoc) - * @see org.apache.tools.ant.Task#execute() - */ - public void execute() throws BuildException - { - super.execute(); + @Override + public void executeUserTask() throws BuildException { try { log( "Listing all groups", Project.MSG_DEBUG ); - final String[] groups = service.getGroups(); + final String[] groups = getService().getGroups(); if( groups != null ) { diff --git a/exist-ant/src/main/java/org/exist/ant/ListUsersTask.java b/exist-ant/src/main/java/org/exist/ant/ListUsersTask.java index 04a34864ab..522e8086f9 100644 --- a/exist-ant/src/main/java/org/exist/ant/ListUsersTask.java +++ b/exist-ant/src/main/java/org/exist/ant/ListUsersTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -37,16 +61,12 @@ public class ListUsersTask extends UserTask private String outputproperty = null; private String separator = ","; - /* (non-Javadoc) - * @see org.apache.tools.ant.Task#execute() - */ - public void execute() throws BuildException - { - super.execute(); + @Override + public void executeUserTask() throws BuildException { try { log( "Listing all users", Project.MSG_DEBUG ); - final Account[] users = service.getAccounts(); + final Account[] users = getService().getAccounts(); if( users != null ) { diff --git a/exist-ant/src/main/java/org/exist/ant/LockResourceTask.java b/exist-ant/src/main/java/org/exist/ant/LockResourceTask.java index 13bb272031..8afd5530aa 100644 --- a/exist-ant/src/main/java/org/exist/ant/LockResourceTask.java +++ b/exist-ant/src/main/java/org/exist/ant/LockResourceTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -38,19 +62,14 @@ public class LockResourceTask extends UserTask private String name = null; private String resource = null; - /* (non-Javadoc) - * @see org.apache.tools.ant.Task#execute() - */ - public void execute() throws BuildException - { - super.execute(); + @Override + public void executeUserTask() throws BuildException { if( ( resource == null ) || ( name == null ) ) { throw( new BuildException( "Must specify user and resource name" ) ); } - try { - final Resource res = base.getResource( resource ); + try (final Resource res = getBase().getResource( resource )) { if( res == null ) { final String msg = "Resource " + resource + " not found"; @@ -62,7 +81,7 @@ public void execute() throws BuildException } } else { - final Account usr = service.getAccount( name ); + final Account usr = getService().getAccount( name ); if( usr == null ) { final String msg = "User " + name + " not found"; @@ -73,7 +92,7 @@ public void execute() throws BuildException log( msg, Project.MSG_ERR ); } } else { - service.lockResource( res, usr ); + getService().lockResource( res, usr ); } } diff --git a/exist-ant/src/main/java/org/exist/ant/RemoveGroupTask.java b/exist-ant/src/main/java/org/exist/ant/RemoveGroupTask.java index 349ee703a0..462e195f22 100644 --- a/exist-ant/src/main/java/org/exist/ant/RemoveGroupTask.java +++ b/exist-ant/src/main/java/org/exist/ant/RemoveGroupTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -34,12 +58,8 @@ public class RemoveGroupTask extends UserTask { private String name = null; - /* (non-Javadoc) - * @see org.apache.tools.ant.Task#execute() - */ - public void execute() throws BuildException - { - super.execute(); + @Override + public void executeUserTask() throws BuildException { if( name == null ) { throw( new BuildException( "You have to specify a name" ) ); @@ -48,10 +68,10 @@ public void execute() throws BuildException log( "Removing group " + name, Project.MSG_INFO ); try { - final Group group = service.getGroup( name ); + final Group group = getService().getGroup( name ); if( group != null ) { - service.removeGroup( group ); + getService().removeGroup( group ); } else { log( "Group " + name + " does not exist.", Project.MSG_INFO ); } diff --git a/exist-ant/src/main/java/org/exist/ant/RemoveUserTask.java b/exist-ant/src/main/java/org/exist/ant/RemoveUserTask.java index 4367d0cf9a..cdce438cbf 100644 --- a/exist-ant/src/main/java/org/exist/ant/RemoveUserTask.java +++ b/exist-ant/src/main/java/org/exist/ant/RemoveUserTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -36,22 +60,18 @@ public class RemoveUserTask extends UserTask { private String name = null; - /* (non-Javadoc) - * @see org.apache.tools.ant.Task#execute() - */ - public void execute() throws BuildException - { - super.execute(); + @Override + public void executeUserTask() throws BuildException { if( name == null ) { throw( new BuildException( "You have to specify a name" ) ); } try { - final Account u = service.getAccount( name ); + final Account u = getService().getAccount( name ); if( u != null ) { - service.removeAccount( u ); + getService().removeAccount( u ); } } diff --git a/exist-ant/src/main/java/org/exist/ant/RestoreTask.java b/exist-ant/src/main/java/org/exist/ant/RestoreTask.java index 89750f5722..80af6c77bc 100644 --- a/exist-ant/src/main/java/org/exist/ant/RestoreTask.java +++ b/exist-ant/src/main/java/org/exist/ant/RestoreTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -88,9 +112,10 @@ public void execute() throws BuildException } } else { final RestoreServiceTaskListener listener = new ConsoleRestoreServiceTaskListener(); - final Collection collection = DatabaseManager.getCollection(uri, user, password); - final EXistRestoreService service = collection.getService(EXistRestoreService.class); - service.restore(file.normalize().toAbsolutePath().toString(), restorePassword, listener, overwriteApps); + try (final Collection collection = DatabaseManager.getCollection(uri, user, password)) { + final EXistRestoreService service = collection.getService(EXistRestoreService.class); + service.restore(file.normalize().toAbsolutePath().toString(), restorePassword, listener, overwriteApps); + } } } else if( dirSet != null ) { @@ -116,9 +141,10 @@ public void execute() throws BuildException // TODO subdirectories as sub-collections? final RestoreServiceTaskListener listener = new ConsoleRestoreServiceTaskListener(); - final Collection collection = DatabaseManager.getCollection(uri, user, password); - final EXistRestoreService service = collection.getService(EXistRestoreService.class); - service.restore(contentsFile.normalize().toAbsolutePath().toString(), restorePassword, listener, overwriteApps); + try (final Collection collection = DatabaseManager.getCollection(uri, user, password)) { + final EXistRestoreService service = collection.getService(EXistRestoreService.class); + service.restore(contentsFile.normalize().toAbsolutePath().toString(), restorePassword, listener, overwriteApps); + } } } @@ -135,9 +161,10 @@ public void execute() throws BuildException } } else { final RestoreServiceTaskListener listener = new ConsoleRestoreServiceTaskListener(); - final Collection collection = DatabaseManager.getCollection(uri, user, password); - final EXistRestoreService service = collection.getService(EXistRestoreService.class); - service.restore(zipFile.normalize().toAbsolutePath().toString(), restorePassword, listener, overwriteApps); + try (final Collection collection = DatabaseManager.getCollection(uri, user, password)) { + final EXistRestoreService service = collection.getService(EXistRestoreService.class); + service.restore(zipFile.normalize().toAbsolutePath().toString(), restorePassword, listener, overwriteApps); + } } } diff --git a/exist-ant/src/main/java/org/exist/ant/UserPasswordTask.java b/exist-ant/src/main/java/org/exist/ant/UserPasswordTask.java index e502fcec90..adc473ba96 100644 --- a/exist-ant/src/main/java/org/exist/ant/UserPasswordTask.java +++ b/exist-ant/src/main/java/org/exist/ant/UserPasswordTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -39,9 +63,7 @@ public class UserPasswordTask extends UserTask private String secret; @Override - public void execute() throws BuildException - { - super.execute(); + public void executeUserTask() throws BuildException { if( name == null ) { throw( new BuildException( "Must specify at least a user name" ) ); @@ -49,14 +71,14 @@ public void execute() throws BuildException try { log( "Looking up user " + name, Project.MSG_INFO ); - final Account usr = service.getAccount( name ); + final Account usr = getService().getAccount( name ); if( usr != null ) { log( "Setting password for user " + name, Project.MSG_INFO ); if( secret != null ) { usr.setCredential(new Password(usr, secret)); - this.service.updateAccount(usr); + getService().updateAccount(usr); } } else { diff --git a/exist-ant/src/main/java/org/exist/ant/UserTask.java b/exist-ant/src/main/java/org/exist/ant/UserTask.java index 382cad210a..08b2e03e60 100644 --- a/exist-ant/src/main/java/org/exist/ant/UserTask.java +++ b/exist-ant/src/main/java/org/exist/ant/UserTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -28,6 +52,8 @@ import org.xmldb.api.base.Collection; import org.xmldb.api.base.XMLDBException; +import javax.annotation.Nullable; + /** * abstract base class for all user-related tasks. @@ -35,47 +61,81 @@ * @author Peter Klotz * @author andrzej@chaeron.com */ -public abstract class UserTask extends AbstractXMLDBTask -{ - protected UserManagementService service = null; - protected Collection base = null; +public abstract class UserTask extends AbstractXMLDBTask { + private @Nullable UserManagementService service = null; + private @Nullable Collection base = null; - /* (non-Javadoc) - * @see org.apache.tools.ant.Task#execute() - */ - public void execute() throws BuildException - { - if( uri == null ) { - throw( new BuildException( "you have to specify an XMLDB collection URI" ) ); + protected UserManagementService getService() { + return service; + } + + protected Collection getBase() { + return base; + } + + @Override + public final void execute() throws BuildException { + try { + prepareToExecuteUserTask(); + executeUserTask(); + } finally { + close(); } - + } + + protected void prepareToExecuteUserTask() throws BuildException { + if (uri == null) { + throw new BuildException( "you have to specify an XMLDB collection URI"); + } + registerDatabase(); - + try { - log( "Get base collection: " + uri, Project.MSG_DEBUG ); - base = DatabaseManager.getCollection( uri, user, password ); + log("Get base collection: " + uri, Project.MSG_DEBUG); + this.base = DatabaseManager.getCollection(uri, user, password); - if( base == null ) { + if (base == null) { final String msg = "Collection " + uri + " could not be found."; - if( failonerror ) { - throw( new BuildException( msg ) ); + if (failonerror) { + throw new BuildException(msg); } else { - log( msg, Project.MSG_ERR ); + log(msg, Project.MSG_ERR); } } else { - service = base.getService( UserManagementService.class); + this.service = base.getService(UserManagementService.class); } - } - catch( final XMLDBException e ) { + } catch (final XMLDBException e) { final String msg = "XMLDB exception caught: " + e.getMessage(); - if( failonerror ) { - throw( new BuildException( msg, e ) ); + if(failonerror) { + throw new BuildException(msg, e); } else { - log( msg, e, Project.MSG_ERR ); + log(msg, e, Project.MSG_ERR); + } + } + } + + /** + * Execute the user task. + * + * @throws BuildException if an error occurs. + */ + public abstract void executeUserTask() throws BuildException; + + protected void close() { + if (service != null) { + service = null; + } + + if (base != null) { + try { + base.close(); + } catch (final XMLDBException e) { + // no-op } + base = null; } } } diff --git a/exist-ant/src/main/java/org/exist/ant/XMLDBCopyTask.java b/exist-ant/src/main/java/org/exist/ant/XMLDBCopyTask.java index 4584c6f8a0..8fe66bd2e4 100644 --- a/exist-ant/src/main/java/org/exist/ant/XMLDBCopyTask.java +++ b/exist-ant/src/main/java/org/exist/ant/XMLDBCopyTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -58,9 +82,8 @@ public void execute() throws BuildException registerDatabase(); - try { - log( "Get base collection: " + uri, Project.MSG_DEBUG ); - final Collection base = DatabaseManager.getCollection( uri, user, password ); + log( "Get base collection: " + uri, Project.MSG_DEBUG ); + try (final Collection base = DatabaseManager.getCollection( uri, user, password)) { if( base == null ) { final String msg = "Collection " + uri + " could not be found."; @@ -77,20 +100,21 @@ public void execute() throws BuildException if( resource != null ) { log( "Copying resource: " + resource, Project.MSG_INFO ); - final Resource res = base.getResource( resource ); + try (final Resource res = base.getResource( resource )) { - if( res == null ) { - final String msg = "Resource " + resource + " not found."; + if (res == null) { + final String msg = "Resource " + resource + " not found."; - if( failonerror ) { - throw( new BuildException( msg ) ); + if (failonerror) { + throw (new BuildException(msg)); + } else { + log(msg, Project.MSG_ERR); + } } else { - log( msg, Project.MSG_ERR ); - } - } else { - //XmldbURI resource = XmldbURI.create(resource); - service.copyResource( XmldbURI.xmldbUriFor( resource ), XmldbURI.xmldbUriFor( destination ), XmldbURI.xmldbUriFor( name ) ); + //XmldbURI resource = XmldbURI.create(resource); + service.copyResource(XmldbURI.xmldbUriFor(resource), XmldbURI.xmldbUriFor(destination), XmldbURI.xmldbUriFor(name)); + } } } else { diff --git a/exist-ant/src/main/java/org/exist/ant/XMLDBCreateTask.java b/exist-ant/src/main/java/org/exist/ant/XMLDBCreateTask.java index 54e37401e3..ac73767c54 100644 --- a/exist-ant/src/main/java/org/exist/ant/XMLDBCreateTask.java +++ b/exist-ant/src/main/java/org/exist/ant/XMLDBCreateTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -29,6 +53,7 @@ import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; +import javax.annotation.Nullable; import java.net.URISyntaxException; @@ -50,9 +75,8 @@ public void execute() throws BuildException registerDatabase(); - try { - log( "Get base collection: " + uri, Project.MSG_DEBUG ); - final Collection base = DatabaseManager.getCollection( uri, user, password ); + log( "Get base collection: " + uri, Project.MSG_DEBUG ); + try (final Collection base = DatabaseManager.getCollection(uri, user, password)) { if( base == null ) { final String msg = "Collection " + uri + " could not be found."; @@ -64,20 +88,30 @@ public void execute() throws BuildException } } else { - Collection root = null; - - if( collection != null ) { - log( "Creating collection " + collection + " in base collection " + uri, Project.MSG_DEBUG ); - root = mkcol( base, uri, collection ); - } else { - root = base; + @Nullable Collection root = null; + try { + if (collection != null) { + log("Creating collection " + collection + " in base collection " + uri, Project.MSG_DEBUG); + root = mkcol(base, uri, collection); + } else { + root = base; + } + + if (permissions != null) { + setPermissions(root); + } + + log("Created collection " + root.getName(), Project.MSG_INFO); + + } finally { + if (root != null) { + try { + root.close(); + } catch (final XMLDBException e) { + // no-op + } + } } - - if( permissions != null ) { - setPermissions( root ); - } - - log( "Created collection " + root.getName(), Project.MSG_INFO ); } } @@ -114,37 +148,33 @@ public void setCollection(final String collection ) } - private Collection mkcol(final Collection root, final String base, /*String path,*/ final String relPath ) throws XMLDBException, URISyntaxException - { - CollectionManagementService mgtService; - Collection current = root; - Collection c; - XmldbURI baseUri = XmldbURI.xmldbUriFor( base ); - final XmldbURI collPath = XmldbURI.xmldbUriFor( relPath ); - log( "BASEURI=" + baseUri, Project.MSG_DEBUG ); - log( "RELPATH=" + relPath, Project.MSG_DEBUG ); - - //log("PATH=" + path, Project.MSG_DEBUG); - + private Collection mkcol(Collection collection, final String base, final String relPath) throws XMLDBException, URISyntaxException { + XmldbURI baseUri = XmldbURI.xmldbUriFor(base); + final XmldbURI collPath = XmldbURI.xmldbUriFor(relPath); final XmldbURI[] segments = collPath.getPathSegments(); - for( final XmldbURI segment : segments ) { - baseUri = baseUri.append( segment ); - - log( "Get collection " + baseUri, Project.MSG_DEBUG ); - c = DatabaseManager.getCollection( baseUri.toString(), user, password ); + for (final XmldbURI segment : segments) { + baseUri = baseUri.append( segment); - if( c == null ) { - log( "Create collection management service for collection " + current.getName(), Project.MSG_DEBUG ); - mgtService = current.getService( CollectionManagementService.class); - log( "Create child collection " + segment ); - current = mgtService.createCollection( segment.toString() ); - log( "Created collection " + current.getName() + '.' ); + Collection child = DatabaseManager.getCollection(baseUri.toString(), user, password); + if (child == null) { + final CollectionManagementService mgtService = collection.getService(CollectionManagementService.class); + log("Create child collection " + segment); + child = mgtService.createCollection(segment.toString()); + log("Created collection " + child.getName() + '.'); + } - } else { - current = c; + try { + // close the parent collection + collection.close(); + } catch (final XMLDBException e) { + // no-op } + + collection = child; + } - return( current ); + + return collection; } } diff --git a/exist-ant/src/main/java/org/exist/ant/XMLDBExistTask.java b/exist-ant/src/main/java/org/exist/ant/XMLDBExistTask.java index 687c379e74..df6a2e07b0 100644 --- a/exist-ant/src/main/java/org/exist/ant/XMLDBExistTask.java +++ b/exist-ant/src/main/java/org/exist/ant/XMLDBExistTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -50,9 +74,8 @@ public boolean eval() throws BuildException registerDatabase(); - try { - log( "Checking collection: " + uri, Project.MSG_INFO ); - final Collection base = DatabaseManager.getCollection( uri, user, password ); + log( "Checking collection: " + uri, Project.MSG_INFO ); + try (final Collection base = DatabaseManager.getCollection(uri, user, password)) { if( base != null ) { log( "Base collection found", Project.MSG_DEBUG ); @@ -61,11 +84,12 @@ public boolean eval() throws BuildException if( ( base != null ) && ( resource != null ) ) { log( "Checking resource: " + resource, Project.MSG_INFO ); - final Resource res = base.getResource( resource ); + try (final Resource res = base.getResource( resource )) { - if( res == null ) { - log( "Resource not found", Project.MSG_DEBUG ); - exist = false; + if (res == null) { + log("Resource not found", Project.MSG_DEBUG); + exist = false; + } } } diff --git a/exist-ant/src/main/java/org/exist/ant/XMLDBExtractTask.java b/exist-ant/src/main/java/org/exist/ant/XMLDBExtractTask.java index d8639c4188..2615fee744 100644 --- a/exist-ant/src/main/java/org/exist/ant/XMLDBExtractTask.java +++ b/exist-ant/src/main/java/org/exist/ant/XMLDBExtractTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -68,8 +92,7 @@ public void execute() throws BuildException { } else { registerDatabase(); - try { - final Collection base = DatabaseManager.getCollection(uri, user, password); + try (final Collection base = DatabaseManager.getCollection(uri, user, password)) { if (base == null) { throw (new BuildException("Collection " + uri + " could not be found.")); @@ -79,18 +102,19 @@ public void execute() throws BuildException { // extraction of a single resource log("Extracting resource: " + resource + " to " + destFile.toAbsolutePath().toString(), Project.MSG_INFO); - final Resource res = base.getResource(resource); + try (final Resource res = base.getResource(resource)) { - if (res == null) { - final String msg = "Resource " + resource + " not found."; + if (res == null) { + final String msg = "Resource " + resource + " not found."; - if (failonerror) { - throw (new BuildException(msg)); + if (failonerror) { + throw (new BuildException(msg)); + } else { + log(msg, Project.MSG_ERR); + } } else { - log(msg, Project.MSG_ERR); + writeResource(res, destFile); } - } else { - writeResource(res, destFile); } } else { @@ -145,17 +169,17 @@ private void extractResources(final Collection base, final String path) throws X } for (final String resource : resources) { - final Resource res = base.getResource(resource); - log("Extracting resource: " + res.getId(), Project.MSG_DEBUG); + try (final Resource res = base.getResource(resource)) { + log("Extracting resource: " + res.getId(), Project.MSG_DEBUG); - if (Files.notExists(dir) && createdirectories) { - Files.createDirectories(dir); - } + if (Files.notExists(dir) && createdirectories) { + Files.createDirectories(dir); + } - if (Files.exists(dir)) { - writeResource(res, dir); + if (Files.exists(dir)) { + writeResource(res, dir); + } } - } } } @@ -173,28 +197,29 @@ private void extractSubCollections(final Collection base, final String path) thr final List childCols = base.listChildCollections(); if (!childCols.isEmpty()) { for (final String childCol : childCols) { - final Collection col = base.getChildCollection(childCol); - - if (col != null) { - log("Extracting collection: " + col.getName(), Project.MSG_DEBUG); - Path dir = destDir; - final String subdir; - - if (path != null) { - dir = destDir.resolve(path).resolve(childCol); - subdir = path + File.separator + childCol; - } else { - subdir = childCol; - } + try (final Collection col = base.getChildCollection(childCol)) { - if (Files.notExists(dir) && createdirectories) { - Files.createDirectories(dir); - } + if (col != null) { + log("Extracting collection: " + col.getName(), Project.MSG_DEBUG); + Path dir = destDir; + final String subdir; - extractResources(col, subdir); + if (path != null) { + dir = destDir.resolve(path).resolve(childCol); + subdir = path + File.separator + childCol; + } else { + subdir = childCol; + } - if (subcollections) { - extractSubCollections(col, subdir); + if (Files.notExists(dir) && createdirectories) { + Files.createDirectories(dir); + } + + extractResources(col, subdir); + + if (subcollections) { + extractSubCollections(col, subdir); + } } } } diff --git a/exist-ant/src/main/java/org/exist/ant/XMLDBListTask.java b/exist-ant/src/main/java/org/exist/ant/XMLDBListTask.java index 01b3d4e9b2..6e14ab74b4 100644 --- a/exist-ant/src/main/java/org/exist/ant/XMLDBListTask.java +++ b/exist-ant/src/main/java/org/exist/ant/XMLDBListTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -57,9 +81,8 @@ public void execute() throws BuildException registerDatabase(); - try { - log( "Get base collection: " + uri, Project.MSG_DEBUG ); - final Collection base = DatabaseManager.getCollection( uri, user, password ); + log( "Get base collection: " + uri, Project.MSG_DEBUG ); + try (final Collection base = DatabaseManager.getCollection(uri, user, password)) { if( base == null ) { final String msg = "Collection " + uri + " could not be found."; diff --git a/exist-ant/src/main/java/org/exist/ant/XMLDBMoveTask.java b/exist-ant/src/main/java/org/exist/ant/XMLDBMoveTask.java index 8d13045bcc..cd52f73dc5 100644 --- a/exist-ant/src/main/java/org/exist/ant/XMLDBMoveTask.java +++ b/exist-ant/src/main/java/org/exist/ant/XMLDBMoveTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -58,10 +82,8 @@ public void execute() throws BuildException registerDatabase(); - try { - log( "Get base collection: " + uri, Project.MSG_DEBUG ); - final Collection base = DatabaseManager.getCollection( uri, user, password ); - + log( "Get base collection: " + uri, Project.MSG_DEBUG ); + try (final Collection base = DatabaseManager.getCollection(uri, user, password)) { if( base == null ) { final String msg = "Collection " + uri + " could not be found."; @@ -77,19 +99,20 @@ public void execute() throws BuildException if( resource != null ) { log( "Moving resource: " + resource, Project.MSG_INFO ); - final Resource res = base.getResource( resource ); + try (final Resource res = base.getResource( resource )) { + + if (res == null) { + final String msg = "Resource " + resource + " not found."; - if( res == null ) { - final String msg = "Resource " + resource + " not found."; + if (failonerror) { + throw (new BuildException(msg)); + } else { + log(msg, Project.MSG_ERR); + } - if( failonerror ) { - throw( new BuildException( msg ) ); } else { - log( msg, Project.MSG_ERR ); + service.moveResource(XmldbURI.xmldbUriFor(resource), XmldbURI.xmldbUriFor(destination), XmldbURI.xmldbUriFor(name)); } - - } else { - service.moveResource( XmldbURI.xmldbUriFor( resource ), XmldbURI.xmldbUriFor( destination ), XmldbURI.xmldbUriFor( name ) ); } } else { diff --git a/exist-ant/src/main/java/org/exist/ant/XMLDBRemoveTask.java b/exist-ant/src/main/java/org/exist/ant/XMLDBRemoveTask.java index 27952c972f..ba04168dce 100644 --- a/exist-ant/src/main/java/org/exist/ant/XMLDBRemoveTask.java +++ b/exist-ant/src/main/java/org/exist/ant/XMLDBRemoveTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -56,9 +80,8 @@ public void execute() throws BuildException registerDatabase(); - try { - log( "Get base collection: " + uri, Project.MSG_DEBUG ); - final Collection base = DatabaseManager.getCollection( uri, user, password ); + log( "Get base collection: " + uri, Project.MSG_DEBUG ); + try (final Collection base = DatabaseManager.getCollection(uri, user, password)) { if( base == null ) { throw( new BuildException( "Collection " + uri + " could not be found." ) ); @@ -66,18 +89,19 @@ public void execute() throws BuildException if( resource != null ) { log( "Removing resource: " + resource, Project.MSG_INFO ); - final Resource res = base.getResource( resource ); + try (final Resource res = base.getResource( resource )) { - if( res == null ) { - final String msg = "Resource " + resource + " not found."; + if (res == null) { + final String msg = "Resource " + resource + " not found."; - if( failonerror ) { - throw( new BuildException( msg ) ); + if (failonerror) { + throw (new BuildException(msg)); + } else { + log(msg, Project.MSG_ERR); + } } else { - log( msg, Project.MSG_ERR ); + base.removeResource(res); } - } else { - base.removeResource( res ); } } else { diff --git a/exist-ant/src/main/java/org/exist/ant/XMLDBShutdownTask.java b/exist-ant/src/main/java/org/exist/ant/XMLDBShutdownTask.java index ce487ae73d..67184f91fc 100644 --- a/exist-ant/src/main/java/org/exist/ant/XMLDBShutdownTask.java +++ b/exist-ant/src/main/java/org/exist/ant/XMLDBShutdownTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -50,9 +74,8 @@ public void execute() throws BuildException registerDatabase(); - try { - log( "Get base collection: " + uri, Project.MSG_DEBUG ); - final Collection root = DatabaseManager.getCollection( uri, user, password ); + log( "Get base collection: " + uri, Project.MSG_DEBUG ); + try (final Collection root = DatabaseManager.getCollection(uri, user, password)) { if( root == null ) { final String msg = "Collection " + uri + " could not be found."; diff --git a/exist-ant/src/main/java/org/exist/ant/XMLDBStoreTask.java b/exist-ant/src/main/java/org/exist/ant/XMLDBStoreTask.java index 4f2ba92826..4300cf982f 100644 --- a/exist-ant/src/main/java/org/exist/ant/XMLDBStoreTask.java +++ b/exist-ant/src/main/java/org/exist/ant/XMLDBStoreTask.java @@ -64,6 +64,7 @@ import xyz.elemental.mediatype.StorageType; import xyz.elemental.mediatype.impl.MediaTypeImpl; +import javax.annotation.Nullable; import java.io.File; import java.util.ArrayList; import java.util.List; @@ -121,134 +122,173 @@ public void execute() throws BuildException { path = uri.substring(p + 3); } - Collection root = null; + @Nullable Collection root = null; try { + try { - if (createCollection) { - root = DatabaseManager.getCollection(baseURI + XmldbURI.ROOT_COLLECTION, user, password); - root = mkcol(root, baseURI, XmldbURI.ROOT_COLLECTION, path); - } else { - root = DatabaseManager.getCollection(uri, user, password); - } - } catch (final XMLDBException e) { - final String msg = "XMLDB exception caught: " + e.getMessage(); + if (createCollection) { + root = DatabaseManager.getCollection(baseURI + XmldbURI.ROOT_COLLECTION, user, password); + root = mkcol(root, baseURI, XmldbURI.ROOT_COLLECTION, path); + } else { + root = DatabaseManager.getCollection(uri, user, password); + } + } catch (final XMLDBException e) { + final String msg = "XMLDB exception caught: " + e.getMessage(); - if (failonerror) { - throw new BuildException(msg, e); - } else { - log(msg, e, Project.MSG_ERR); - return; + if (failonerror) { + throw new BuildException(msg, e); + } else { + log(msg, e, Project.MSG_ERR); + return; + } } - } - if (root == null) { - final String msg = "Collection " + uri + " could not be found."; + if (root == null) { + final String msg = "Collection " + uri + " could not be found."; + + if (failonerror) { + throw new BuildException(msg); + } else { + log(msg, Project.MSG_ERR); + } - if (failonerror) { - throw new BuildException(msg); } else { - log(msg, Project.MSG_ERR); - } - } else { - Collection col = root; - String relDir; - String prevDir = null; + if (srcFile != null) { + log("Storing " + srcFile.getName()); - if (srcFile != null) { - log("Storing " + srcFile.getName()); + MediaType mediaType = getMediaTypeResolver().fromFileName(srcFile.getName()); + final String baseMediaType; - MediaType mediaType = getMediaTypeResolver().fromFileName(srcFile.getName()); - final String baseMediaType; + if (forceMimeType != null) { + baseMediaType = forceMimeType; - if (forceMimeType != null) { - baseMediaType = forceMimeType; + } else if (mediaType != null) { + baseMediaType = mediaType.getIdentifier(); - } else if (mediaType != null) { - baseMediaType = mediaType.getIdentifier(); + } else { + baseMediaType = defaultMimeType; + } - } else { - baseMediaType = defaultMimeType; - } + if (type != null) { + if ("xml".equals(type) && (mediaType == null || mediaType.getStorageType() != StorageType.XML)) { + if (baseMediaType != null) { + mediaType = MediaTypeImpl.builder(baseMediaType, StorageType.XML).build(); + } else { + mediaType = mediaTypeResolver.fromString(MediaType.APPLICATION_XML); + } - if (type != null) { - if ("xml".equals(type) && (mediaType == null || mediaType.getStorageType() != StorageType.XML)) { - if (baseMediaType != null) { - mediaType = MediaTypeImpl.builder(baseMediaType, StorageType.XML).build(); - } else { - mediaType = mediaTypeResolver.fromString(MediaType.APPLICATION_XML); + } else if ("binary".equals(type) && (mediaType == null || mediaType.getStorageType() != StorageType.BINARY)) { + if (baseMediaType != null) { + mediaType = MediaTypeImpl.builder(baseMediaType, StorageType.BINARY).build(); + } else { + mediaType = mediaTypeResolver.forUnknown(); + } } + } - } else if ("binary".equals(type) && (mediaType == null || mediaType.getStorageType() != StorageType.BINARY)) { + // single file + if (mediaType == null) { + final String msg = "Cannot guess mime-type kind for " + srcFile.getName() + ". Treating it as a binary."; + log(msg, Project.MSG_ERR); if (baseMediaType != null) { mediaType = MediaTypeImpl.builder(baseMediaType, StorageType.BINARY).build(); } else { mediaType = mediaTypeResolver.forUnknown(); } } - } - // single file - if (mediaType == null) { - final String msg = "Cannot guess mime-type kind for " + srcFile.getName() + ". Treating it as a binary."; - log(msg, Project.MSG_ERR); - if (baseMediaType != null) { - mediaType = MediaTypeImpl.builder(baseMediaType, StorageType.BINARY).build(); - } else { - mediaType = mediaTypeResolver.forUnknown(); - } - } + final Class resourceType = mediaType.getStorageType() == StorageType.XML ? XMLResource.class : BinaryResource.class; - final Class resourceType = mediaType.getStorageType() == StorageType.XML ? XMLResource.class : BinaryResource.class; + if (targetFile == null) { + targetFile = srcFile.getName(); + } - if (targetFile == null) { - targetFile = srcFile.getName(); - } + try { + log("Creating resource " + targetFile + " in collection " + root.getName() + " of type " + resourceType + " with media-type: " + mediaType.getIdentifier(), Project.MSG_DEBUG); + try (final Resource res = root.createResource(targetFile, resourceType)) { + if (srcFile.length() == 0) { + // note: solves bug id 2429889 when this task hits empty files + } else { + res.setContent(srcFile); + ((EXistResource) res).setMediaType(mediaType.getIdentifier()); + root.storeResource(res); + } - try { - log("Creating resource " + targetFile + " in collection " + col.getName() + " of type " + resourceType + " with media-type: " + mediaType.getIdentifier(), Project.MSG_DEBUG); - try (Resource res = col.createResource(targetFile, resourceType)) { - if (srcFile.length() == 0) { - // note: solves bug id 2429889 when this task hits empty files - } else { - res.setContent(srcFile); - ((EXistResource) res).setMediaType(mediaType.getIdentifier()); - col.storeResource(res); + if (permissions != null) { + setPermissions(res); + } } + } catch (final XMLDBException e) { + final String msg = "XMLDB exception caught: " + e.getMessage(); - if (permissions != null) { - setPermissions(res); + if (failonerror) { + throw new BuildException(msg, e); + } else { + log(msg, e, Project.MSG_ERR); } } - } catch (final XMLDBException e) { - final String msg = "XMLDB exception caught: " + e.getMessage(); + } else { - if (failonerror) { - throw new BuildException(msg, e); - } else { - log(msg, e, Project.MSG_ERR); - } - } - } else { + for (final FileSet fileSet : fileSetList) { + log("Storing fileset", Project.MSG_DEBUG); + + // using fileset + final DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject()); + scanner.scan(); + final String[] includedFiles = scanner.getIncludedFiles(); + final String[] includedDirs = scanner.getIncludedDirectories(); + log("Found " + includedDirs.length + " directories and " + includedFiles.length + " files.\n"); + + final File baseDir = scanner.getBasedir(); + + if (includeEmptyDirs && createSubcollections) { + + @Nullable String prevDir = null; + for (final String included : includedDirs) { + + try { + log("Creating " + included + " ...\n"); + + //TODO : use dedicated function in XmldbURI + // check whether the relative file path contains file seps + + p = included.lastIndexOf(File.separatorChar); - for (final FileSet fileSet : fileSetList) { - log("Storing fileset", Project.MSG_DEBUG); + if (p != Constants.STRING_NOT_FOUND) { + String relDir = included.substring(0, p); - // using fileset - final DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject()); - scanner.scan(); - final String[] includedFiles = scanner.getIncludedFiles(); - final String[] includedDirs = scanner.getIncludedDirectories(); - log("Found " + includedDirs.length + " directories and " + includedFiles.length + " files.\n"); + // It's necessary to do this translation on Windows, and possibly MacOS: + relDir = relDir.replace(File.separatorChar, '/'); - final File baseDir = scanner.getBasedir(); + if (createSubcollections && ((prevDir == null) || (!relDir.equals(prevDir)))) { - if (includeEmptyDirs && createSubcollections) { + //TODO : use dedicated function in XmldbURI + root = mkcol(root, baseURI, XmldbURI.ROOT_COLLECTION + path, relDir); + prevDir = relDir; + } - for (final String included : includedDirs) { + } else { + root = mkcol(root, baseURI, XmldbURI.ROOT_COLLECTION + path, included); + } + } catch (final XMLDBException e) { + final String msg = "XMLDB exception caught: " + e.getMessage(); + + if (failonerror) { + throw new BuildException(msg, e); + } else { + log(msg, e, Project.MSG_ERR); + } + } + } + } + + @Nullable String prevDir = null; + for (final String included : includedFiles) { try { - log("Creating " + included + " ...\n"); + final File file = new File(baseDir, included); + log("Storing " + included + " ...\n"); //TODO : use dedicated function in XmldbURI // check whether the relative file path contains file seps @@ -256,7 +296,7 @@ public void execute() throws BuildException { p = included.lastIndexOf(File.separatorChar); if (p != Constants.STRING_NOT_FOUND) { - relDir = included.substring(0, p); + String relDir = included.substring(0, p); // It's necessary to do this translation on Windows, and possibly MacOS: relDir = relDir.replace(File.separatorChar, '/'); @@ -264,120 +304,100 @@ public void execute() throws BuildException { if (createSubcollections && ((prevDir == null) || (!relDir.equals(prevDir)))) { //TODO : use dedicated function in XmldbURI - col = mkcol(root, baseURI, XmldbURI.ROOT_COLLECTION + path, relDir); + root = mkcol(root, baseURI, XmldbURI.ROOT_COLLECTION + path, relDir); prevDir = relDir; } } else { - col = mkcol(root, baseURI, XmldbURI.ROOT_COLLECTION + path, included); - } - } catch (final XMLDBException e) { - final String msg = "XMLDB exception caught: " + e.getMessage(); - if (failonerror) { - throw new BuildException(msg, e); - } else { - log(msg, e, Project.MSG_ERR); + // No file separator found in resource name, reset col to the root collection + try { + root.close(); + } catch (final XMLDBException e) { + // no-op + } + if (createCollection) { + root = DatabaseManager.getCollection(baseURI + XmldbURI.ROOT_COLLECTION, user, password); + root = mkcol(root, baseURI, XmldbURI.ROOT_COLLECTION, path); + } else { + root = DatabaseManager.getCollection(uri, user, password); + } } - } - } - } - - for (final String included : includedFiles) { - try { - final File file = new File(baseDir, included); - log("Storing " + included + " ...\n"); + MediaType currentMediaType = getMediaTypeResolver().fromFileName(file.getName()); + final String currentBaseMediaType; - //TODO : use dedicated function in XmldbURI - // check whether the relative file path contains file seps + if (forceMimeType != null) { + currentBaseMediaType = forceMimeType; - p = included.lastIndexOf(File.separatorChar); + } else if (currentMediaType != null) { + currentBaseMediaType = currentMediaType.getIdentifier(); - if (p != Constants.STRING_NOT_FOUND) { - relDir = included.substring(0, p); - - // It's necessary to do this translation on Windows, and possibly MacOS: - relDir = relDir.replace(File.separatorChar, '/'); - - if (createSubcollections && ((prevDir == null) || (!relDir.equals(prevDir)))) { + } else { + currentBaseMediaType = defaultMimeType; - //TODO : use dedicated function in XmldbURI - col = mkcol(root, baseURI, XmldbURI.ROOT_COLLECTION + path, relDir); - prevDir = relDir; } - } else { - - // No file separator found in resource name, reset col to the root collection - col = root; - } - - MediaType currentMediaType = getMediaTypeResolver().fromFileName(file.getName()); - final String currentBaseMediaType; - - if (forceMimeType != null) { - currentBaseMediaType = forceMimeType; - - } else if (currentMediaType != null) { - currentBaseMediaType = currentMediaType.getIdentifier(); - - } else { - currentBaseMediaType = defaultMimeType; - - } - - if (type != null) { - - if ("xml".equals(type) && (currentMediaType == null || currentMediaType.getStorageType() != StorageType.XML)) { - if (currentBaseMediaType != null) { - currentMediaType = MediaTypeImpl.builder(currentBaseMediaType, StorageType.XML).build(); - } else { - currentMediaType = mediaTypeResolver.fromString(MediaType.APPLICATION_XML); + if (type != null) { + + if ("xml".equals(type) && (currentMediaType == null || currentMediaType.getStorageType() != StorageType.XML)) { + if (currentBaseMediaType != null) { + currentMediaType = MediaTypeImpl.builder(currentBaseMediaType, StorageType.XML).build(); + } else { + currentMediaType = mediaTypeResolver.fromString(MediaType.APPLICATION_XML); + } + + } else if ("binary".equals(type) && (currentMediaType == null || currentMediaType.getStorageType() != StorageType.BINARY)) { + if (currentBaseMediaType != null) { + currentMediaType = MediaTypeImpl.builder(currentBaseMediaType, StorageType.BINARY).build(); + } else { + currentMediaType = mediaTypeResolver.forUnknown(); + } } + } - } else if ("binary".equals(type) && (currentMediaType == null || currentMediaType.getStorageType() != StorageType.BINARY)) { + if (currentMediaType == null) { + final String msg = "Cannot find mime-type kind for " + file.getName() + ". Treating it as a binary."; + log(msg, Project.MSG_ERR); if (currentBaseMediaType != null) { currentMediaType = MediaTypeImpl.builder(currentBaseMediaType, StorageType.BINARY).build(); } else { currentMediaType = mediaTypeResolver.forUnknown(); } } - } - - if (currentMediaType == null) { - final String msg = "Cannot find mime-type kind for " + file.getName() + ". Treating it as a binary."; - log(msg, Project.MSG_ERR); - if (currentBaseMediaType != null) { - currentMediaType = MediaTypeImpl.builder(currentBaseMediaType, StorageType.BINARY).build(); - } else { - currentMediaType = mediaTypeResolver.forUnknown(); - } - } - final Class resourceType = currentMediaType.getStorageType() == StorageType.XML ? XMLResource.class : BinaryResource.class; - log("Creating resource " + file.getName() + " in collection " + col.getName() + " of type " + resourceType + " with media-type: " + currentMediaType.getIdentifier(), Project.MSG_DEBUG); - try (Resource res = col.createResource(file.getName(), resourceType)) { - res.setContent(file); - ((EXistResource) res).setMediaType(currentMediaType.getIdentifier()); - col.storeResource(res); + final Class resourceType = currentMediaType.getStorageType() == StorageType.XML ? XMLResource.class : BinaryResource.class; + log("Creating resource " + file.getName() + " in collection " + root.getName() + " of type " + resourceType + " with media-type: " + currentMediaType.getIdentifier(), Project.MSG_DEBUG); + try (final Resource res = root.createResource(file.getName(), resourceType)) { + res.setContent(file); + ((EXistResource) res).setMediaType(currentMediaType.getIdentifier()); + root.storeResource(res); - if (permissions != null) { - setPermissions(res); + if (permissions != null) { + setPermissions(res); + } } - } - } catch (final XMLDBException e) { - final String msg = "XMLDB exception caught: " + e.getMessage(); + } catch (final XMLDBException e) { + final String msg = "XMLDB exception caught: " + e.getMessage(); - if (failonerror) { - throw new BuildException(msg, e); - } else { - log(msg, e, Project.MSG_ERR); + if (failonerror) { + throw new BuildException(msg, e); + } else { + log(msg, e, Project.MSG_ERR); + } } } } } } + } finally { + if (root != null) { + try { + root.close(); + } catch (final XMLDBException e) { + // no-op + } + } } } diff --git a/exist-ant/src/main/java/org/exist/ant/XMLDBXPathTask.java b/exist-ant/src/main/java/org/exist/ant/XMLDBXPathTask.java index a6135a4968..d2f0a77268 100644 --- a/exist-ant/src/main/java/org/exist/ant/XMLDBXPathTask.java +++ b/exist-ant/src/main/java/org/exist/ant/XMLDBXPathTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -26,10 +50,10 @@ import org.apache.tools.ant.PropertyHelper; import org.exist.util.serializer.SAXSerializer; import org.exist.util.serializer.SerializerPool; +import org.exist.xmldb.EXistResourceSet; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.ResourceIterator; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XPathQueryService; @@ -84,9 +108,8 @@ public void execute() throws BuildException { registerDatabase(); - try { - log("Get base collection: " + uri, Project.MSG_DEBUG); - final Collection base = DatabaseManager.getCollection(uri, user, password); + log("Get base collection: " + uri, Project.MSG_DEBUG); + try (final Collection base = DatabaseManager.getCollection(uri, user, password)) { if (base == null) { final String msg = "Collection " + uri + " could not be found."; @@ -109,42 +132,50 @@ public void execute() throws BuildException { service.setNamespace("ns", namespace); } - final ResourceSet results; - if (resource != null) { - log("Query resource: " + resource, Project.MSG_DEBUG); - results = service.queryResource(resource, query); - } else { - log("Query collection", Project.MSG_DEBUG); - results = service.query(query); - } - log("Found " + results.getSize() + " results", Project.MSG_INFO); - - if ((destDir != null) && (results != null)) { - log("write results to directory " + destDir.getAbsolutePath(), Project.MSG_INFO); - final ResourceIterator iter = results.getIterator(); - - log("Writing results to directory " + destDir.getAbsolutePath(), Project.MSG_DEBUG); - - while (iter.hasMoreResources()) { - final XMLResource res = (XMLResource) iter.nextResource(); - log("Writing resource " + res.getId(), Project.MSG_DEBUG); - writeResource(res, destDir); + EXistResourceSet results = null; + try { + if (resource != null) { + log("Query resource: " + resource, Project.MSG_DEBUG); + results = (EXistResourceSet) service.queryResource(resource, query); + } else { + log("Query collection", Project.MSG_DEBUG); + results = (EXistResourceSet) service.query(query); } + log("Found " + results.getSize() + " results", Project.MSG_INFO); - } else if (outputproperty != null) { - - if (count) { - getProject().setNewProperty(outputproperty, String.valueOf(results.getSize())); - } else { + if ((destDir != null) && (results != null)) { + log("write results to directory " + destDir.getAbsolutePath(), Project.MSG_INFO); final ResourceIterator iter = results.getIterator(); - final StringBuilder result = new StringBuilder(); + + log("Writing results to directory " + destDir.getAbsolutePath(), Project.MSG_DEBUG); while (iter.hasMoreResources()) { - final XMLResource res = (XMLResource) iter.nextResource(); - result.append(res.getContent().toString()); - result.append("\n"); + try (final XMLResource res = (XMLResource) iter.nextResource()) { + log("Writing resource " + res.getId(), Project.MSG_DEBUG); + writeResource(res, destDir); + } } - getProject().setNewProperty(outputproperty, result.toString()); + + } else if (outputproperty != null) { + + if (count) { + getProject().setNewProperty(outputproperty, String.valueOf(results.getSize())); + } else { + final ResourceIterator iter = results.getIterator(); + final StringBuilder result = new StringBuilder(); + + while (iter.hasMoreResources()) { + try (final XMLResource res = (XMLResource) iter.nextResource()) { + result.append(res.getContent().toString()); + result.append("\n"); + } + } + getProject().setNewProperty(outputproperty, result.toString()); + } + } + } finally { + if (results != null) { + results.close(); } } } diff --git a/exist-ant/src/main/java/org/exist/ant/XMLDBXQueryTask.java b/exist-ant/src/main/java/org/exist/ant/XMLDBXQueryTask.java index c05dbf49f2..8ea5078fae 100644 --- a/exist-ant/src/main/java/org/exist/ant/XMLDBXQueryTask.java +++ b/exist-ant/src/main/java/org/exist/ant/XMLDBXQueryTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -27,10 +51,14 @@ import org.exist.source.*; import org.exist.util.serializer.SAXSerializer; import org.exist.util.serializer.SerializerPool; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.EXistXQueryService; import org.exist.xmldb.XmldbURI; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.ResourceIterator; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import javax.xml.transform.OutputKeys; @@ -81,9 +109,8 @@ public void execute() throws BuildException { registerDatabase(); - try { - log("Get base collection: " + uri, Project.MSG_DEBUG); - final Collection base = DatabaseManager.getCollection(uri, user, password); + log("Get base collection: " + uri, Project.MSG_DEBUG); + try (final Collection base = DatabaseManager.getCollection(uri, user, password)) { if (base == null) { final String msg = "Collection " + uri + " could not be found."; @@ -108,47 +135,57 @@ public void execute() throws BuildException { } final Source source; - if (queryUri != null) { - log("XQuery url " + queryUri, Project.MSG_DEBUG); - - if (queryUri.startsWith(XmldbURI.XMLDB_URI_PREFIX)) { - final Resource resource = base.getResource(queryUri); - source = new BinarySource((byte[]) resource.getContent(), true); + Resource resource = null; + try { + if (queryUri != null) { + log("XQuery url " + queryUri, Project.MSG_DEBUG); + + if (queryUri.startsWith(XmldbURI.XMLDB_URI_PREFIX)) { + resource = base.getResource(queryUri); + source = new BinarySource((byte[]) resource.getContent(), true); + } else { + source = new URLSource(new URL(queryUri)); + } + } else if (queryFile != null) { + log("XQuery file " + queryFile.getAbsolutePath(), Project.MSG_DEBUG); + source = new FileSource(queryFile.toPath(), true); } else { - source = new URLSource(new URL(queryUri)); + log("XQuery string: " + query, Project.MSG_DEBUG); + source = new StringSource(query); } - } else if (queryFile != null) { - log("XQuery file " + queryFile.getAbsolutePath(), Project.MSG_DEBUG); - source = new FileSource(queryFile.toPath(), true); - } else { - log("XQuery string: " + query, Project.MSG_DEBUG); - source = new StringSource(query); - } - - final ResourceSet results = service.execute(source); - log("Found " + results.getSize() + " results", Project.MSG_INFO); - - if ((destDir != null) && (results != null)) { - log("write results to directory " + destDir.getAbsolutePath(), Project.MSG_INFO); - final ResourceIterator iter = results.getIterator(); - log("Writing results to directory " + destDir.getAbsolutePath(), Project.MSG_DEBUG); - - while (iter.hasMoreResources()) { - final XMLResource res = (XMLResource) iter.nextResource(); - log("Writing resource " + res.getId(), Project.MSG_DEBUG); - writeResource(res, destDir); + try (final EXistResourceSet results = (EXistResourceSet) service.execute(source)) { + log("Found " + results.getSize() + " results", Project.MSG_INFO); + + if ((destDir != null) && (results != null)) { + log("write results to directory " + destDir.getAbsolutePath(), Project.MSG_INFO); + final ResourceIterator iter = results.getIterator(); + + log("Writing results to directory " + destDir.getAbsolutePath(), Project.MSG_DEBUG); + + while (iter.hasMoreResources()) { + try (final XMLResource res = (XMLResource) iter.nextResource()) { + log("Writing resource " + res.getId(), Project.MSG_DEBUG); + writeResource(res, destDir); + } + } + + } else if (outputproperty != null) { + final ResourceIterator iter = results.getIterator(); + String result = null; + + while (iter.hasMoreResources()) { + try (final XMLResource res = (XMLResource) iter.nextResource()) { + result = res.getContent().toString(); + } + } + getProject().setNewProperty(outputproperty, result); + } } - - } else if (outputproperty != null) { - final ResourceIterator iter = results.getIterator(); - String result = null; - - while (iter.hasMoreResources()) { - final XMLResource res = (XMLResource) iter.nextResource(); - result = res.getContent().toString(); + } finally { + if (resource != null) { + resource.close(); } - getProject().setNewProperty(outputproperty, result); } } diff --git a/exist-ant/src/main/java/org/exist/ant/XMLDBXUpdateTask.java b/exist-ant/src/main/java/org/exist/ant/XMLDBXUpdateTask.java index 116376aaf8..7f14c2214d 100644 --- a/exist-ant/src/main/java/org/exist/ant/XMLDBXUpdateTask.java +++ b/exist-ant/src/main/java/org/exist/ant/XMLDBXUpdateTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -50,9 +74,8 @@ public void execute() throws BuildException log( "XUpdate command is: " + commands, Project.MSG_DEBUG ); registerDatabase(); - try { - log( "Get base collection: " + uri, Project.MSG_DEBUG ); - final Collection base = DatabaseManager.getCollection( uri, user, password ); + log( "Get base collection: " + uri, Project.MSG_DEBUG ); + try (final Collection base = DatabaseManager.getCollection(uri, user, password)) { if( base == null ) { final String msg = "Collection " + uri + " could not be found."; @@ -68,18 +91,19 @@ public void execute() throws BuildException if( resource != null ) { log( "Updating resource: " + resource, Project.MSG_INFO ); - final Resource res = base.getResource( resource ); + try (final Resource res = base.getResource( resource )) { - if( res == null ) { - final String msg = "Resource " + resource + " not found."; + if (res == null) { + final String msg = "Resource " + resource + " not found."; - if( failonerror ) { - throw( new BuildException( msg ) ); + if (failonerror) { + throw (new BuildException(msg)); + } else { + log(msg, Project.MSG_ERR); + } } else { - log( msg, Project.MSG_ERR ); + service.updateResource(resource, commands); } - } else { - service.updateResource( resource, commands ); } } else { diff --git a/exist-ant/src/test/java/org/exist/ant/FileTaskTest.java b/exist-ant/src/test/java/org/exist/ant/FileTaskTest.java index 17157bbd09..d9256ada0a 100644 --- a/exist-ant/src/test/java/org/exist/ant/FileTaskTest.java +++ b/exist-ant/src/test/java/org/exist/ant/FileTaskTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -59,10 +83,11 @@ protected URL getBuildFile() { @Before public void fileSetup() throws XMLDBException { - final Collection col = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), TEST_COLLECTION_NAME); - final Resource res = col.createResource(TEST_RESOURCE_NAME, XMLResource.class); - res.setContent(""); - col.storeResource(res); + try (final Collection col = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), TEST_COLLECTION_NAME); + final Resource res = col.createResource(TEST_RESOURCE_NAME, XMLResource.class)) { + res.setContent(""); + col.storeResource(res); + } } @After diff --git a/exist-ant/src/test/java/org/exist/ant/ServerTaskTest.java b/exist-ant/src/test/java/org/exist/ant/ServerTaskTest.java index 7db1a5cfb4..b2c6112fc3 100644 --- a/exist-ant/src/test/java/org/exist/ant/ServerTaskTest.java +++ b/exist-ant/src/test/java/org/exist/ant/ServerTaskTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -74,8 +98,9 @@ public void restore() throws URISyntaxException, XMLDBException { buildFileRule.executeTarget("restore"); - final Resource res = existEmbeddedServer.getRoot().getResource("example.xml"); - assertNotNull(res); + try (final Resource res = existEmbeddedServer.getRoot().getResource("example.xml")) { + assertNotNull(res); + } } @Test diff --git a/exist-ant/src/test/java/org/exist/ant/XmldbTaskTest.java b/exist-ant/src/test/java/org/exist/ant/XmldbTaskTest.java index dc01a910d2..3606e1f52b 100644 --- a/exist-ant/src/test/java/org/exist/ant/XmldbTaskTest.java +++ b/exist-ant/src/test/java/org/exist/ant/XmldbTaskTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -77,24 +101,25 @@ protected URL getBuildFile() { @Before public void fileSetup() throws XMLDBException { - final Collection col = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), TEST_COLLECTION_NAME); - - final Resource res = col.createResource(TEST_RESOURCE_NAME, XMLResource.class); - res.setContent("hello world"); - col.storeResource(res); - - final Resource binResource = col.createResource(BIN_TEST_RESOURCE_NAME, BinaryResource.class); - binResource.setContent("blah blah"); - col.storeResource(binResource); - - final CollectionManagementService service = col.getService(CollectionManagementService.class); - final Collection otherCol = service.createCollection(OTHER_TEST_COLLECTION_NAME); - final Resource otherRes = otherCol.createResource(OTHER_TEST_RESOURCE_NAME, XMLResource.class); - otherRes.setContent("other"); - otherCol.storeResource(otherRes); - otherCol.close(); - - col.close(); + try (final Collection col = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), TEST_COLLECTION_NAME)) { + + try (final Resource res = col.createResource(TEST_RESOURCE_NAME, XMLResource.class)) { + res.setContent("hello world"); + col.storeResource(res); + } + + try (final Resource binResource = col.createResource(BIN_TEST_RESOURCE_NAME, BinaryResource.class)) { + binResource.setContent("blah blah"); + col.storeResource(binResource); + } + + final CollectionManagementService service = col.getService(CollectionManagementService.class); + try (final Collection otherCol = service.createCollection(OTHER_TEST_COLLECTION_NAME); + final Resource otherRes = otherCol.createResource(OTHER_TEST_RESOURCE_NAME, XMLResource.class)) { + otherRes.setContent("other"); + otherCol.storeResource(otherRes); + } + } } @After diff --git a/exist-core-jcstress/pom.xml b/exist-core-jcstress/pom.xml index a50146a851..efb33bfd85 100644 --- a/exist-core-jcstress/pom.xml +++ b/exist-core-jcstress/pom.xml @@ -167,4 +167,4 @@ - + \ No newline at end of file diff --git a/exist-core-jmh/pom.xml b/exist-core-jmh/pom.xml index 31dd13bde6..55e84af3af 100644 --- a/exist-core-jmh/pom.xml +++ b/exist-core-jmh/pom.xml @@ -218,4 +218,4 @@ - + \ No newline at end of file diff --git a/exist-core/pom.xml b/exist-core/pom.xml index 8e983645cb..63c423acdd 100644 --- a/exist-core/pom.xml +++ b/exist-core/pom.xml @@ -757,6 +757,7 @@ src/main/java/org/exist/util/StringUtil.java src/main/java/org/exist/util/io/AbstractContentFile.java src/test/java/org/exist/util/serializer/SAXSerializerTest.java + src/main/java/org/exist/xmldb/EXistResourceSet.java src/test/java/org/exist/xmldb/XMLDBExternalVariableTest.java src/main/java/org/exist/xmlrpc/ArrayWrapperParser.java src/main/java/org/exist/xmlrpc/ArrayWrapperSerializer.java @@ -818,7 +819,7 @@ src/test/java/org/exist/IndexerTest.java src/main/java/org/exist/Namespaces.java src/main/resources-filtered/org/exist/system.properties - src/test/java/org/exist/TestDataGenerator + src/test/java/org/exist/TestDataGenerator.java src/main/java/org/exist/backup/Backup.java src/main/java/org/exist/backup/CreateBackupDialog.java src/test/java/org/exist/backup/DeepEmbeddedBackupRestoreTest.java @@ -830,18 +831,21 @@ src/main/java/org/exist/backup/SystemExport.java src/test/java/org/exist/backup/SystemExportFiltersTest.java src/test/java/org/exist/backup/SystemExportImportTest.java + src/test/java/org/exist/backup/XMLDBBackupTest.java src/test/java/org/exist/backup/XMLDBRestoreTest.java src/main/java/org/exist/backup/ZipWriter.java src/main/java/org/exist/backup/restore/AbstractRestoreHandler.java src/main/java/org/exist/backup/restore/AppRestoreUtils.java src/main/java/org/exist/backup/xquery/RetrieveBackup.java src/main/java/org/exist/client/ClientFrame.java + src/main/java/org/exist/client/CollectionXConf.java src/main/java/org/exist/client/CommandlineOptions.java src/main/java/org/exist/client/Connection.java src/main/java/org/exist/client/ConnectionDialog.java src/main/java/org/exist/client/DocumentView.java src/main/java/org/exist/client/IndexDialog.java src/main/java/org/exist/client/InteractiveClient.java + src/test/java/org/exist/client/InteractiveClientTest.java src/main/java/org/exist/client/MediaTypeFileFilter.java src/main/resources/org/exist/client/messages.properties src/main/resources/org/exist/client/messages_es_ES.properties @@ -867,15 +871,18 @@ src/test/java/org/exist/collections/CollectionOrderTest.java src/test/java/org/exist/collections/CollectionRemovalTest.java src/test/java/org/exist/collections/CollectionStoreTest.java + src/test/java/org/exist/collections/ConcurrencyTest.java src/main/java/org/exist/collections/LockedCollection.java src/main/java/org/exist/collections/MutableCollection.java src/test/java/org/exist/collections/OpenCollectionTest src/main/java/org/exist/collections/triggers/CollectionTrigger.java src/main/java/org/exist/collections/triggers/CollectionTriggers.java + src/test/java/org/exist/collections/triggers/CollectionTriggerTest.java src/main/java/org/exist/collections/triggers/DocumentTrigger.java src/main/java/org/exist/collections/triggers/DocumentTriggers.java src/test/java/org/exist/collections/triggers/HistoryTriggerTest.java src/test/java/org/exist/collections/triggers/MessagesTrigger.java + src/test/java/org/exist/collections/triggers/SAXTriggerTest.java src/test/java/org/exist/collections/triggers/TriggerConfigTest.java src/main/java/org/exist/collections/triggers/XQueryStartupTrigger.java src/main/java/org/exist/collections/triggers/XQueryTrigger.java @@ -895,6 +902,7 @@ src/main/java/org/exist/dom/memtree/AbstractCharacterData.java src/main/java/org/exist/dom/memtree/AttrImpl.java src/main/java/org/exist/dom/memtree/DocumentBuilderReceiver.java + src/test/java/org/exist/dom/memtree/DocumentBuilderReceiverIntegrationTest.java src/main/java/org/exist/dom/memtree/DocumentImpl.java src/test/java/org/exist/dom/memtree/DocumentImplTest.java src/main/java/org/exist/dom/memtree/DOMIndexer.java @@ -1011,8 +1019,8 @@ src/main/java/org/exist/security/AXSchemaType.java src/main/java/org/exist/security/EffectiveSubject.java src/main/java/org/exist/security/EXistSchemaType.java - src/test/java/org/exist/security/FnDocSecurityTest.java src/test/java/org/exist/security/FnCollectionSecurityTest.java + src/test/java/org/exist/security/FnDocSecurityTest.java src/main/java/org/exist/security/Permission.java src/main/java/org/exist/security/PermissionRequired.java src/main/java/org/exist/security/Principal.java @@ -1023,8 +1031,11 @@ src/test/java/org/exist/security/SimpleACLPermissionTest.java src/main/java/org/exist/security/UnixStylePermissionInternal.java src/test/java/org/exist/security/UnixStylePermissionTest.java + src/test/java/org/exist/security/XmldbApiSecurityTest.java + src/test/java/org/exist/security/XMLDBSecurityTest.java src/test/java/org/exist/security/XqueryApiTest.java src/main/java/org/exist/security/internal/AccountImpl.java + src/test/java/org/exist/security/internal/BackupRestoreSecurityPrincipalsTest.java src/main/java/org/exist/security/internal/RealmImpl.java src/main/java/org/exist/security/internal/SecurityManagerImpl.java src/main/java/org/exist/security/internal/aider/UnixStylePermissionAider.java @@ -1118,6 +1129,7 @@ src/test/java/org/exist/util/AbstractXMLReaderSecurityTest.java src/main/java/org/exist/util/Collations.java src/test/java/org/exist/util/CollationsTest.java + src/main/java/org/exist/util/CollectionScanner.java src/main/java/org/exist/util/Configuration.java src/test/java/org/exist/util/DOMSerializerTest.java src/test/java/org/exist/util/LeasableTest.java @@ -1160,7 +1172,9 @@ src/test/java/org/exist/util/sorters/PlainArrayChecker.java src/test/java/org/exist/util/sorters/SortTestNodeId.java src/test/resources/org/exist/validation/catalog.xml + src/test/java/org/exist/validation/CollectionConfigurationTest.java src/test/java/org/exist/validation/CollectionConfigurationValidationModeTest.java + src/test/java/org/exist/validation/DatabaseCollectionTest.java src/test/java/org/exist/validation/DtdEntityTest.java src/test/java/org/exist/validation/TestTools.java src/main/java/org/exist/validation/XmlLibraryChecker.java @@ -1173,28 +1187,47 @@ src/main/java/org/exist/webstart/JnlpWriter.java src/main/java/org/exist/xmldb/AbstractEXistResource.java src/main/java/org/exist/xmldb/AbstractRemoteResource.java + src/test/java/org/exist/xmldb/BinaryResourceUpdateTest.java + src/test/java/org/exist/xmldb/CollectionConfigurationTest.java + src/test/java/org/exist/xmldb/CollectionTest.java src/test/java/org/exist/xmldb/ContentAsDOMTest.java + src/test/java/org/exist/xmldb/CopyMoveTest.java src/test/java/org/exist/xmldb/CreateCollectionsTest.java + src/test/java/org/exist/xmldb/DeclareVariableTest.java + src/test/java/org/exist/xmldb/DeleteCollectionTest.java + src/test/java/org/exist/xmldb/DOMTest.java src/main/java/org/exist/xmldb/EXistResource.java src/test/java/org/exist/xmldb/EXistXMLSerializeTest.java + src/main/java/org/exist/xmldb/EXistXPathQueryService.java + src/main/java/org/exist/xmldb/EXistXQueryService.java src/test/java/org/exist/xmldb/IndexingTest.java src/main/java/org/exist/xmldb/LocalBinaryResource.java src/main/java/org/exist/xmldb/LocalCollection.java + src/test/java/org/exist/xmldb/LocalCollectionTest.java src/main/java/org/exist/xmldb/LocalResourceSet.java src/main/java/org/exist/xmldb/LocalRestoreService.java src/main/java/org/exist/xmldb/LocalXMLResource.java + src/test/java/org/exist/xmldb/LocalXMLResourceDOMTest.java src/main/java/org/exist/xmldb/LocalXPathQueryService.java + src/main/java/org/exist/xmldb/MapResourceSet.java + src/test/java/org/exist/xmldb/MoveCollectionTest.java + src/test/java/org/exist/xmldb/MultiDBTest.java src/main/java/org/exist/xmldb/RemoteBinaryResource.java src/main/java/org/exist/xmldb/RemoteCollection.java src/test/java/org/exist/xmldb/RemoteCollectionTest.java + src/test/java/org/exist/xmldb/RemoteDatabaseImplTest.java + src/test/java/org/exist/xmldb/RemoteDBTest.java src/test/java/org/exist/xmldb/RemoteDOMTest.java src/test/java/org/exist/xmldb/RemoteQueryTest.java src/main/java/org/exist/xmldb/RemoteResourceSet.java src/main/java/org/exist/xmldb/RemoteRestoreService.java src/main/java/org/exist/xmldb/RemoteXMLResource.java src/main/java/org/exist/xmldb/RemoteXPathQueryService.java + src/test/java/org/exist/xmldb/RenameCollectionTest.java + src/test/java/org/exist/xmldb/ResourceSetTest.java src/test/java/org/exist/xmldb/ResourceTest.java src/test/java/org/exist/xmldb/SerializationTest.java + src/test/java/org/exist/xmldb/ShutdownTest.java src/test/java/org/exist/xmldb/TestEXistXMLSerialize.java src/test/java/org/exist/xmldb/TreeLevelOrderTest.java src/test/java/org/exist/xmldb/concurrent/AbstractConcurrentTest.java @@ -1206,12 +1239,24 @@ src/test/java/org/exist/xmldb/concurrent/ConcurrentResourceTest.java src/test/java/org/exist/xmldb/concurrent/ConcurrentXUpdateTest.java src/test/java/org/exist/xmldb/concurrent/DBUtils.java + src/test/java/org/exist/xmldb/concurrent/DeadlockTest.java src/test/java/org/exist/xmldb/concurrent/FragmentsTest.java src/test/java/org/exist/xmldb/concurrent/TextUpdateTest.java src/test/java/org/exist/xmldb/concurrent/ValueIndexUpdateTest.java src/test/java/org/exist/xmldb/concurrent/XMLGenerator.java + src/test/java/org/exist/xmldb/concurrent/action/AttributeUpdateAction.java + src/test/java/org/exist/xmldb/concurrent/action/ComplexUpdateAction.java + src/test/java/org/exist/xmldb/concurrent/action/CreateCollectionAction.java src/test/java/org/exist/xmldb/concurrent/action/MultiResourcesAction.java + src/test/java/org/exist/xmldb/concurrent/action/RemoveAppendAction.java + src/test/java/org/exist/xmldb/concurrent/action/ReplaceResourceAction.java + src/test/java/org/exist/xmldb/concurrent/action/RetrieveResourceAction.java + src/test/java/org/exist/xmldb/concurrent/action/TextUpdateAction.java + src/test/java/org/exist/xmldb/concurrent/action/ValueAppendAction.java + src/test/java/org/exist/xmldb/concurrent/action/XQueryAction.java + src/test/java/org/exist/xmldb/concurrent/action/XQueryUpdateAction.java src/main/java/org/exist/xmlrpc/ExistRpcTypeFactory.java + src/test/java/org/exist/xmlrpc/MimeTypeTest.java src/test/java/org/exist/xmlrpc/QuerySessionTest.java src/main/java/org/exist/xmlrpc/RpcAPI.java src/main/java/org/exist/xmlrpc/RpcConnection.java @@ -1219,45 +1264,64 @@ src/main/java/org/exist/xqj/Marshaller.java src/test/java/org/exist/xqj/MarshallerTest.java src/test/java/org/exist/xquery/AbsolutePathTests.java + src/test/java/org/exist/xquery/AbstractDescendantOrSelfNodeKindTest.java src/main/java/org/exist/xquery/AbstractInternalModule.java + src/test/java/org/exist/xquery/AnnotationsTest.java src/main/java/org/exist/xquery/ArrowOperator.java src/test/java/org/exist/xquery/CardinalityTest.java src/test/java/org/exist/xquery/CleanupTest.java src/test/java/org/exist/xquery/ConstructedNodesRecoveryTest.java + src/test/java/org/exist/xquery/ConstructedNodesTest.java src/main/java/org/exist/xquery/Context.java + src/test/java/org/exist/xquery/ConversionsTest.java src/main/java/org/exist/xquery/DecimalFormat.java + src/test/java/org/exist/xquery/DeepEqualTest.java src/main/java/org/exist/xquery/DeferredFunctionCall.java + src/test/java/org/exist/xquery/DocumentUpdateTest.java + src/test/java/org/exist/xquery/DuplicateAttributesTest.java src/main/java/org/exist/xquery/DynamicCardinalityCheck.java src/main/java/org/exist/xquery/DynamicTypeCheck.java src/main/java/org/exist/xquery/DynamicVariable.java src/test/java/org/exist/xquery/EmbeddedBinariesTest.java src/test/java/org/exist/xquery/EmbeddedBinariesTest.java.java + src/test/java/org/exist/xquery/EntitiesTest.java src/main/java/org/exist/xquery/ErrorCodes.java src/main/java/org/exist/xquery/Except.java src/main/java/org/exist/xquery/ExternalModuleImpl.java src/test/java/org/exist/xquery/ForwardReferenceTest.java src/main/java/org/exist/xquery/Function.java src/main/java/org/exist/xquery/FunctionFactory.java - src/test/java/org/exist/xquery/FunctionTypeInElementContentTest.java + src/test/java/org/exist/xquery/FunctionTypeInElementContentTest.java src/main/java/org/exist/xquery/InlineFunction.java + src/test/java/org/exist/xquery/InternalModuleTest.java src/main/java/org/exist/xquery/Intersect.java src/test/java/org/exist/xquery/LexerTest.java src/main/java/org/exist/xquery/LocationStep.java src/main/java/org/exist/xquery/Lookup.java + src/test/java/org/exist/xquery/MemtreeDescendantOrSelfNodeKindTest.java src/main/java/org/exist/xquery/Module.java src/main/java/org/exist/xquery/NamedFunctionReference.java + src/test/java/org/exist/xquery/NamespaceUpdateTest.java src/main/java/org/exist/xquery/NameTest.java src/test/java/org/exist/xquery/NodeTypeTest.java src/main/java/org/exist/xquery/OpNumeric.java src/main/java/org/exist/xquery/Optimizer.java + src/test/java/org/exist/xquery/OptimizerTest.java src/main/java/org/exist/xquery/Option.java src/main/java/org/exist/xquery/PathExpr.java src/main/java/org/exist/xquery/PerformanceStatsImpl.java + src/test/java/org/exist/xquery/PersistentDescendantOrSelfNodeKindTest.java + src/test/java/org/exist/xquery/QueryPoolTest.java src/test/java/org/exist/xquery/RestBinariesTest.java + src/test/java/org/exist/xquery/SeqOpTest.java + src/test/java/org/exist/xquery/SpecialNamesTest.java src/test/java/org/exist/xquery/StoredModuleTest.java src/test/java/org/exist/xquery/TransformTest.java src/main/java/org/exist/xquery/TryCatchExpression.java + src/test/java/org/exist/xquery/UnionTest.java src/main/java/org/exist/xquery/UserDefinedFunction.java + src/test/java/org/exist/xquery/ValueIndexByQNameTest.java + src/test/java/org/exist/xquery/ValueIndexTest.java src/main/java/org/exist/xquery/Variable.java src/main/java/org/exist/xquery/VariableDeclaration.java src/main/java/org/exist/xquery/VariableImpl.java @@ -1277,9 +1341,10 @@ src/test/java/org/exist/xquery/XQueryTest.java src/test/java/org/exist/xquery/XQueryUpdateTest.java src/main/java/org/exist/xquery/functions/array/ArrayType.java - src/test/java/org/exist/xquery/functions/fn/DocTest.java src/test/java/org/exist/xquery/functions/fn/CollectionTest.java + src/test/java/org/exist/xquery/functions/fn/DocTest.java src/main/java/org/exist/xquery/functions/fn/ExtCollection.java + src/test/java/org/exist/xquery/functions/fn/ExtDocTest.java src/main/java/org/exist/xquery/functions/fn/FnDefaultLanguage.java src/main/java/org/exist/xquery/functions/fn/FnFormatDates.java src/main/java/org/exist/xquery/functions/fn/FnHasChildren.java @@ -1344,6 +1409,7 @@ src/main/java/org/exist/xquery/functions/fn/FunNormalizeUnicode.java src/main/java/org/exist/xquery/functions/fn/FunNot.java src/main/java/org/exist/xquery/functions/fn/FunNumber.java + src/test/java/org/exist/xquery/functions/fn/FunNumberTest.java src/main/java/org/exist/xquery/functions/fn/FunOneOrMore.java src/main/java/org/exist/xquery/functions/fn/FunOnFunctions.java src/main/java/org/exist/xquery/functions/fn/FunParseIetfDate.java @@ -1363,7 +1429,9 @@ src/main/java/org/exist/xquery/functions/fn/FunStringJoin.java src/main/java/org/exist/xquery/functions/fn/FunStringToCodepoints.java src/main/java/org/exist/xquery/functions/fn/FunStrLength.java + src/test/java/org/exist/xquery/functions/fn/FunStrLengthTest.java src/main/java/org/exist/xquery/functions/fn/FunSubSequence.java + src/test/java/org/exist/xquery/functions/fn/FunSubSequenceTest.java src/main/java/org/exist/xquery/functions/fn/FunSubstring.java src/main/java/org/exist/xquery/functions/fn/FunSubstringAfter.java src/main/java/org/exist/xquery/functions/fn/FunSubstringBefore.java @@ -1415,6 +1483,8 @@ src/main/java/org/exist/xquery/functions/transform/Transform.java src/test/java/org/exist/xquery/functions/transform/TransformFromPkgTest.java src/test/java/org/exist/xquery/functions/transform/TransformTest.java + src/test/java/org/exist/xquery/functions/util/Base64FunctionsTest.java + src/test/java/org/exist/xquery/functions/util/BaseConverterTest.java src/main/java/org/exist/xquery/functions/util/BuiltinFunctions.java src/main/java/org/exist/xquery/functions/util/DescribeFunction.java src/test/java/org/exist/xquery/functions/util/EvalTest.java @@ -1423,6 +1493,7 @@ src/main/java/org/exist/xquery/functions/util/LogFunction.java src/main/java/org/exist/xquery/functions/util/ModuleInfo.java src/test/java/org/exist/xquery/functions/util/ParseHtmlTest.java + src/test/java/org/exist/xquery/functions/validate/AdditionalJingXsdRngTest.java src/test/java/org/exist/xquery/functions/validate/JaxpDtdCatalogTest.java src/test/java/org/exist/xquery/functions/validate/JaxpParseTest.java src/test/java/org/exist/xquery/functions/validate/JaxpXsdCatalogTest.java @@ -1433,13 +1504,17 @@ src/test/java/org/exist/xquery/functions/validate/JingXsdTest.java src/main/java/org/exist/xquery/functions/validation/Jaxp.java src/test/java/org/exist/xquery/functions/xmldb/DbStore2Test.java + src/test/java/org/exist/xquery/functions/xmldb/DbStoreTest.java src/main/java/org/exist/xquery/functions/xmldb/FunXCollection.java + src/main/java/org/exist/xquery/functions/xmldb/XMLDBAbstractCollectionManipulator.java src/main/java/org/exist/xquery/functions/xmldb/XMLDBGetMimeType.java src/main/java/org/exist/xquery/functions/xmldb/XMLDBLoadFromPattern.java src/main/java/org/exist/xquery/functions/xmldb/XMLDBModule.java src/main/java/org/exist/xquery/functions/xmldb/XMLDBSetMimeType.java src/main/java/org/exist/xquery/functions/xmldb/XMLDBStore.java src/main/java/org/exist/xquery/functions/xmldb/XMLDBXUpdate.java + src/test/java/org/exist/xquery/functions/xquery3/DeclareVariableTest.java + src/test/java/org/exist/xquery/functions/xquery3/SwitchTest.java src/test/java/org/exist/xquery/functions/xquery3/TryCatchTest.java src/main/antlr/org/exist/xquery/parser/XQuery.g src/main/antlr/org/exist/xquery/parser/XQueryTree.g @@ -1455,6 +1530,7 @@ src/main/java/org/exist/xquery/value/AbstractDateTimeValue.java src/main/java/org/exist/xquery/value/AbstractTimeRelatedTest.java src/main/java/org/exist/xquery/value/AnyURIValue.java + src/test/java/org/exist/xquery/value/Base64BinaryTest.java src/test/java/org/exist/xquery/value/Base64BinaryValueTypeTest.java src/main/java/org/exist/xquery/value/BinaryValue.java src/main/java/org/exist/xquery/value/BooleanValue.java @@ -1498,6 +1574,7 @@ src/test/java/org/exist/xupdate/RemoveAppendTest.java src/main/java/org/exist/xupdate/Rename.java src/main/java/org/exist/xupdate/Replace.java + src/test/java/org/exist/xupdate/StressTest.java src/main/java/org/exist/xupdate/Update.java src/main/java/org/exist/xupdate/XUpdateProcessor.java src/test/java/org/exist/xupdate/XUpdateTest.java @@ -1555,7 +1632,7 @@ src/test/java/org/exist/IndexerTest.java src/main/java/org/exist/Namespaces.java src/main/resources-filtered/org/exist/system.properties - src/test/java/org/exist/TestDataGenerator + src/test/java/org/exist/TestDataGenerator.java src/main/java/org/exist/backup/Backup.java src/main/java/org/exist/backup/CreateBackupDialog.java src/test/java/org/exist/backup/DeepEmbeddedBackupRestoreTest.java @@ -1567,18 +1644,21 @@ src/main/java/org/exist/backup/SystemExport.java src/test/java/org/exist/backup/SystemExportFiltersTest.java src/test/java/org/exist/backup/SystemExportImportTest.java + src/test/java/org/exist/backup/XMLDBBackupTest.java src/test/java/org/exist/backup/XMLDBRestoreTest.java src/main/java/org/exist/backup/ZipWriter.java src/main/java/org/exist/backup/restore/AbstractRestoreHandler.java src/main/java/org/exist/backup/restore/AppRestoreUtils.java src/main/java/org/exist/backup/xquery/RetrieveBackup.java src/main/java/org/exist/client/ClientFrame.java + src/main/java/org/exist/client/CollectionXConf.java src/main/java/org/exist/client/CommandlineOptions.java src/main/java/org/exist/client/Connection.java src/main/java/org/exist/client/ConnectionDialog.java src/main/java/org/exist/client/DocumentView.java src/main/java/org/exist/client/IndexDialog.java src/main/java/org/exist/client/InteractiveClient.java + src/test/java/org/exist/client/InteractiveClientTest.java src/main/java/org/exist/client/MediaTypeFileFilter.java src/main/resources/org/exist/client/messages.properties src/main/resources/org/exist/client/messages_es_ES.properties @@ -1604,15 +1684,18 @@ src/test/java/org/exist/collections/CollectionOrderTest.java src/test/java/org/exist/collections/CollectionRemovalTest.java src/test/java/org/exist/collections/CollectionStoreTest.java + src/test/java/org/exist/collections/ConcurrencyTest.java src/main/java/org/exist/collections/LockedCollection.java src/main/java/org/exist/collections/MutableCollection.java src/test/java/org/exist/collections/OpenCollectionTest src/main/java/org/exist/collections/triggers/CollectionTrigger.java src/main/java/org/exist/collections/triggers/CollectionTriggers.java + src/test/java/org/exist/collections/triggers/CollectionTriggerTest.java src/main/java/org/exist/collections/triggers/DocumentTrigger.java src/main/java/org/exist/collections/triggers/DocumentTriggers.java src/test/java/org/exist/collections/triggers/HistoryTriggerTest.java src/test/java/org/exist/collections/triggers/MessagesTrigger.java + src/test/java/org/exist/collections/triggers/SAXTriggerTest.java src/test/java/org/exist/collections/triggers/TriggerConfigTest.java src/main/java/org/exist/collections/triggers/XQueryStartupTrigger.java src/main/java/org/exist/collections/triggers/XQueryTrigger.java @@ -1632,6 +1715,7 @@ src/main/java/org/exist/dom/memtree/AbstractCharacterData.java src/main/java/org/exist/dom/memtree/AttrImpl.java src/main/java/org/exist/dom/memtree/DocumentBuilderReceiver.java + src/test/java/org/exist/dom/memtree/DocumentBuilderReceiverIntegrationTest.java src/main/java/org/exist/dom/memtree/DocumentImpl.java src/test/java/org/exist/dom/memtree/DocumentImplTest.java src/main/java/org/exist/dom/memtree/DocumentTypeImpl.java @@ -1763,8 +1847,8 @@ src/main/java/org/exist/security/AXSchemaType.java src/main/java/org/exist/security/EffectiveSubject.java src/main/java/org/exist/security/EXistSchemaType.java - src/test/java/org/exist/security/FnDocSecurityTest.java src/test/java/org/exist/security/FnCollectionSecurityTest.java + src/test/java/org/exist/security/FnDocSecurityTest.java src/main/java/org/exist/security/Permission.java src/main/java/org/exist/security/PermissionRequired.java src/main/java/org/exist/security/PermissionRequiredCheck.java @@ -1776,8 +1860,11 @@ src/test/java/org/exist/security/SimpleACLPermissionTest.java src/main/java/org/exist/security/UnixStylePermissionInternal.java src/test/java/org/exist/security/UnixStylePermissionTest.java + src/test/java/org/exist/security/XmldbApiSecurityTest.java + src/test/java/org/exist/security/XMLDBSecurityTest.java src/test/java/org/exist/security/XqueryApiTest.java src/main/java/org/exist/security/internal/AccountImpl.java + src/test/java/org/exist/security/internal/BackupRestoreSecurityPrincipalsTest.java src/main/java/org/exist/security/internal/RealmImpl.java src/main/java/org/exist/security/internal/SecurityManagerImpl.java src/main/java/org/exist/security/internal/aider/UnixStylePermissionAider.java @@ -1931,6 +2018,7 @@ src/test/java/org/exist/util/CollationsTest.java src/main/java/org/exist/util/CollectionOfArrayIterator.java src/test/java/org/exist/util/CollectionOfArrayIteratorTest.java + src/main/java/org/exist/util/CollectionScanner.java src/main/java/org/exist/util/Configuration.java src/test/java/org/exist/util/DOMSerializerTest.java src/main/java/org/exist/util/IPUtil.java @@ -1981,7 +2069,9 @@ src/test/java/org/exist/util/sorters/PlainArrayChecker.java src/test/java/org/exist/util/sorters/SortTestNodeId.java src/test/resources/org/exist/validation/catalog.xml + src/test/java/org/exist/validation/CollectionConfigurationTest.java src/test/java/org/exist/validation/CollectionConfigurationValidationModeTest.java + src/test/java/org/exist/validation/DatabaseCollectionTest.java src/test/java/org/exist/validation/DtdEntityTest.java src/test/java/org/exist/validation/TestTools.java src/main/java/org/exist/validation/XmlLibraryChecker.java @@ -1994,28 +2084,48 @@ src/main/java/org/exist/webstart/JnlpWriter.java src/main/java/org/exist/xmldb/AbstractEXistResource.java src/main/java/org/exist/xmldb/AbstractRemoteResource.java + src/test/java/org/exist/xmldb/BinaryResourceUpdateTest.java + src/test/java/org/exist/xmldb/CollectionConfigurationTest.java + src/test/java/org/exist/xmldb/CollectionTest.java src/test/java/org/exist/xmldb/ContentAsDOMTest.java + src/test/java/org/exist/xmldb/CopyMoveTest.java src/test/java/org/exist/xmldb/CreateCollectionsTest.java + src/test/java/org/exist/xmldb/DeclareVariableTest.java + src/test/java/org/exist/xmldb/DeleteCollectionTest.java + src/test/java/org/exist/xmldb/DOMTest.java src/main/java/org/exist/xmldb/EXistResource.java + src/main/java/org/exist/xmldb/EXistResourceSet.java src/test/java/org/exist/xmldb/EXistXMLSerializeTest.java + src/main/java/org/exist/xmldb/EXistXPathQueryService.java + src/main/java/org/exist/xmldb/EXistXQueryService.java src/test/java/org/exist/xmldb/IndexingTest.java src/main/java/org/exist/xmldb/LocalBinaryResource.java src/main/java/org/exist/xmldb/LocalCollection.java + src/test/java/org/exist/xmldb/LocalCollectionTest.java src/main/java/org/exist/xmldb/LocalResourceSet.java src/main/java/org/exist/xmldb/LocalRestoreService.java src/main/java/org/exist/xmldb/LocalXMLResource.java + src/test/java/org/exist/xmldb/LocalXMLResourceDOMTest.java src/main/java/org/exist/xmldb/LocalXPathQueryService.java + src/main/java/org/exist/xmldb/MapResourceSet.java + src/test/java/org/exist/xmldb/MoveCollectionTest.java + src/test/java/org/exist/xmldb/MultiDBTest.java src/main/java/org/exist/xmldb/RemoteBinaryResource.java src/main/java/org/exist/xmldb/RemoteCollection.java src/test/java/org/exist/xmldb/RemoteCollectionTest.java + src/test/java/org/exist/xmldb/RemoteDatabaseImplTest.java + src/test/java/org/exist/xmldb/RemoteDBTest.java src/test/java/org/exist/xmldb/RemoteDOMTest.java src/test/java/org/exist/xmldb/RemoteQueryTest.java src/main/java/org/exist/xmldb/RemoteResourceSet.java src/main/java/org/exist/xmldb/RemoteRestoreService.java src/main/java/org/exist/xmldb/RemoteXMLResource.java src/main/java/org/exist/xmldb/RemoteXPathQueryService.java + src/test/java/org/exist/xmldb/RenameCollectionTest.java + src/test/java/org/exist/xmldb/ResourceSetTest.java src/test/java/org/exist/xmldb/ResourceTest.java src/test/java/org/exist/xmldb/SerializationTest.java + src/test/java/org/exist/xmldb/ShutdownTest.java src/test/java/org/exist/xmldb/TestEXistXMLSerialize.java src/test/java/org/exist/xmldb/TreeLevelOrderTest.java src/test/java/org/exist/xmldb/XMLDBExternalVariableTest.java @@ -2028,16 +2138,28 @@ src/test/java/org/exist/xmldb/concurrent/ConcurrentResourceTest.java src/test/java/org/exist/xmldb/concurrent/ConcurrentXUpdateTest.java src/test/java/org/exist/xmldb/concurrent/DBUtils.java + src/test/java/org/exist/xmldb/concurrent/DeadlockTest.java src/test/java/org/exist/xmldb/concurrent/FragmentsTest.java src/test/java/org/exist/xmldb/concurrent/TextUpdateTest.java src/test/java/org/exist/xmldb/concurrent/ValueIndexUpdateTest.java src/test/java/org/exist/xmldb/concurrent/XMLGenerator.java + src/test/java/org/exist/xmldb/concurrent/action/AttributeUpdateAction.java + src/test/java/org/exist/xmldb/concurrent/action/ComplexUpdateAction.java + src/test/java/org/exist/xmldb/concurrent/action/CreateCollectionAction.java src/test/java/org/exist/xmldb/concurrent/action/MultiResourcesAction.java + src/test/java/org/exist/xmldb/concurrent/action/RemoveAppendAction.java + src/test/java/org/exist/xmldb/concurrent/action/ReplaceResourceAction.java + src/test/java/org/exist/xmldb/concurrent/action/RetrieveResourceAction.java + src/test/java/org/exist/xmldb/concurrent/action/TextUpdateAction.java + src/test/java/org/exist/xmldb/concurrent/action/ValueAppendAction.java + src/test/java/org/exist/xmldb/concurrent/action/XQueryAction.java + src/test/java/org/exist/xmldb/concurrent/action/XQueryUpdateAction.java src/main/java/org/exist/xmlrpc/ACEAiderParser.java src/main/java/org/exist/xmlrpc/ACEAiderSerializer.java src/main/java/org/exist/xmlrpc/ArrayWrapperParser.java src/main/java/org/exist/xmlrpc/ArrayWrapperSerializer.java src/main/java/org/exist/xmlrpc/ExistRpcTypeFactory.java + src/test/java/org/exist/xmlrpc/MimeTypeTest.java src/test/java/org/exist/xmlrpc/QuerySessionTest.java src/main/java/org/exist/xmlrpc/RpcAPI.java src/main/java/org/exist/xmlrpc/RpcConnection.java @@ -2046,7 +2168,9 @@ src/main/java/org/exist/xqj/Marshaller.java src/test/java/org/exist/xqj/MarshallerTest.java src/test/java/org/exist/xquery/AbsolutePathTests.java + src/test/java/org/exist/xquery/AbstractDescendantOrSelfNodeKindTest.java src/main/java/org/exist/xquery/AbstractInternalModule.java + src/test/java/org/exist/xquery/AnnotationsTest.java src/main/java/org/exist/xquery/ArrowOperator.java src/test/java/org/exist/xquery/ArrowOperatorTest.java src/main/java/org/exist/xquery/Cardinality.java @@ -2054,14 +2178,20 @@ src/test/java/org/exist/xquery/CastExpressionTest.java src/test/java/org/exist/xquery/CleanupTest.java src/test/java/org/exist/xquery/ConstructedNodesRecoveryTest.java + src/test/java/org/exist/xquery/ConstructedNodesTest.java src/main/java/org/exist/xquery/Context.java + src/test/java/org/exist/xquery/ConversionsTest.java src/main/java/org/exist/xquery/DecimalFormat.java + src/test/java/org/exist/xquery/DeepEqualTest.java src/main/java/org/exist/xquery/DeferredFunctionCall.java + src/test/java/org/exist/xquery/DocumentUpdateTest.java + src/test/java/org/exist/xquery/DuplicateAttributesTest.java src/main/java/org/exist/xquery/DynamicCardinalityCheck.java src/main/java/org/exist/xquery/DynamicTypeCheck.java src/main/java/org/exist/xquery/DynamicVariable.java src/test/java/org/exist/xquery/EmbeddedBinariesTest.java src/test/java/org/exist/xquery/EmbeddedBinariesTest.java.java + src/test/java/org/exist/xquery/EntitiesTest.java src/main/java/org/exist/xquery/ErrorCodes.java src/main/java/org/exist/xquery/Except.java src/main/java/org/exist/xquery/ExternalModuleImpl.java @@ -2073,6 +2203,7 @@ src/test/java/org/exist/xquery/ImportFromPkgTest.java src/test/java/org/exist/xquery/ImportModuleTest.java src/main/java/org/exist/xquery/InlineFunction.java + src/test/java/org/exist/xquery/InternalModuleTest.java src/main/java/org/exist/xquery/Intersect.java src/main/java/org/exist/xquery/JavaBinding.java src/test/resources-filtered/org/exist/xquery/JavaBindingTest.conf.xml @@ -2081,20 +2212,30 @@ src/main/java/org/exist/xquery/LocationStep.java src/main/java/org/exist/xquery/Lookup.java src/main/java/org/exist/xquery/Materializable.java + src/test/java/org/exist/xquery/MemtreeDescendantOrSelfNodeKindTest.java src/main/java/org/exist/xquery/Module.java src/main/java/org/exist/xquery/NamedFunctionReference.java + src/test/java/org/exist/xquery/NamespaceUpdateTest.java src/main/java/org/exist/xquery/NameTest.java src/test/java/org/exist/xquery/NodeTypeTest.java src/main/java/org/exist/xquery/OpNumeric.java src/main/java/org/exist/xquery/Optimizer.java + src/test/java/org/exist/xquery/OptimizerTest.java src/main/java/org/exist/xquery/Option.java src/main/java/org/exist/xquery/PathExpr.java src/main/java/org/exist/xquery/PerformanceStatsImpl.java + src/test/java/org/exist/xquery/PersistentDescendantOrSelfNodeKindTest.java + src/test/java/org/exist/xquery/QueryPoolTest.java src/test/java/org/exist/xquery/RestBinariesTest.java + src/test/java/org/exist/xquery/SeqOpTest.java + src/test/java/org/exist/xquery/SpecialNamesTest.java src/test/java/org/exist/xquery/StoredModuleTest.java src/test/java/org/exist/xquery/TransformTest.java src/main/java/org/exist/xquery/TryCatchExpression.java + src/test/java/org/exist/xquery/UnionTest.java src/main/java/org/exist/xquery/UserDefinedFunction.java + src/test/java/org/exist/xquery/ValueIndexByQNameTest.java + src/test/java/org/exist/xquery/ValueIndexTest.java src/main/java/org/exist/xquery/Variable.java src/main/java/org/exist/xquery/VariableDeclaration.java src/main/java/org/exist/xquery/VariableImpl.java @@ -2118,9 +2259,10 @@ src/test/java/org/exist/xquery/XQueryUpdateTest.java src/main/java/org/exist/xquery/XQueryUtil.java src/main/java/org/exist/xquery/functions/array/ArrayType.java - src/test/java/org/exist/xquery/functions/fn/DocTest.java src/test/java/org/exist/xquery/functions/fn/CollectionTest.java + src/test/java/org/exist/xquery/functions/fn/DocTest.java src/main/java/org/exist/xquery/functions/fn/ExtCollection.java + src/test/java/org/exist/xquery/functions/fn/ExtDocTest.java src/main/java/org/exist/xquery/functions/fn/FnDefaultLanguage.java src/main/java/org/exist/xquery/functions/fn/FnFormatDates.java src/main/java/org/exist/xquery/functions/fn/FnHasChildren.java @@ -2186,6 +2328,7 @@ src/main/java/org/exist/xquery/functions/fn/FunNormalizeUnicode.java src/main/java/org/exist/xquery/functions/fn/FunNot.java src/main/java/org/exist/xquery/functions/fn/FunNumber.java + src/test/java/org/exist/xquery/functions/fn/FunNumberTest.java src/main/java/org/exist/xquery/functions/fn/FunOneOrMore.java src/main/java/org/exist/xquery/functions/fn/FunOnFunctions.java src/main/java/org/exist/xquery/functions/fn/FunParseIetfDate.java @@ -2205,7 +2348,9 @@ src/main/java/org/exist/xquery/functions/fn/FunStringJoin.java src/main/java/org/exist/xquery/functions/fn/FunStringToCodepoints.java src/main/java/org/exist/xquery/functions/fn/FunStrLength.java + src/test/java/org/exist/xquery/functions/fn/FunStrLengthTest.java src/main/java/org/exist/xquery/functions/fn/FunSubSequence.java + src/test/java/org/exist/xquery/functions/fn/FunSubSequenceTest.java src/main/java/org/exist/xquery/functions/fn/FunSubstring.java src/main/java/org/exist/xquery/functions/fn/FunSubstringAfter.java src/main/java/org/exist/xquery/functions/fn/FunSubstringBefore.java @@ -2267,6 +2412,8 @@ src/main/java/org/exist/xquery/functions/transform/Transform.java src/test/java/org/exist/xquery/functions/transform/TransformFromPkgTest.java src/test/java/org/exist/xquery/functions/transform/TransformTest.java + src/test/java/org/exist/xquery/functions/util/Base64FunctionsTest.java + src/test/java/org/exist/xquery/functions/util/BaseConverterTest.java src/main/java/org/exist/xquery/functions/util/BuiltinFunctions.java src/main/java/org/exist/xquery/functions/util/DescribeFunction.java src/main/java/org/exist/xquery/functions/util/Eval.java @@ -2276,6 +2423,7 @@ src/main/java/org/exist/xquery/functions/util/LogFunction.java src/main/java/org/exist/xquery/functions/util/ModuleInfo.java src/test/java/org/exist/xquery/functions/util/ParseHtmlTest.java + src/test/java/org/exist/xquery/functions/validate/AdditionalJingXsdRngTest.java src/test/java/org/exist/xquery/functions/validate/JaxpDtdCatalogTest.java src/test/java/org/exist/xquery/functions/validate/JaxpParseTest.java src/test/java/org/exist/xquery/functions/validate/JaxpXsdCatalogTest.java @@ -2287,7 +2435,9 @@ src/main/java/org/exist/xquery/functions/validation/Jaxp.java src/test/java/org/exist/xquery/functions/xmldb/AbstractXMLDBTest.java src/test/java/org/exist/xquery/functions/xmldb/DbStore2Test.java + src/test/java/org/exist/xquery/functions/xmldb/DbStoreTest.java src/main/java/org/exist/xquery/functions/xmldb/FunXCollection.java + src/main/java/org/exist/xquery/functions/xmldb/XMLDBAbstractCollectionManipulator.java src/test/java/org/exist/xquery/functions/xmldb/XMLDBAuthenticateTest.java src/main/java/org/exist/xquery/functions/xmldb/XMLDBGetMimeType.java src/main/java/org/exist/xquery/functions/xmldb/XMLDBLoadFromPattern.java @@ -2296,7 +2446,9 @@ src/main/java/org/exist/xquery/functions/xmldb/XMLDBStore.java src/test/java/org/exist/xquery/functions/xmldb/XMLDBStoreTest.java src/main/java/org/exist/xquery/functions/xmldb/XMLDBXUpdate.java + src/test/java/org/exist/xquery/functions/xquery3/DeclareVariableTest.java src/test/java/org/exist/xquery/functions/xquery3/SerializeTest.java + src/test/java/org/exist/xquery/functions/xquery3/SwitchTest.java src/test/java/org/exist/xquery/functions/xquery3/TryCatchTest.java src/main/antlr/org/exist/xquery/parser/XQuery.g src/main/antlr/org/exist/xquery/parser/XQueryTree.g @@ -2317,6 +2469,7 @@ src/main/java/org/exist/xquery/value/ArrayListValueSequence.java src/main/java/org/exist/xquery/value/ArrayWrapper.java src/main/java/org/exist/xquery/value/AtomicValueComparator.java + src/test/java/org/exist/xquery/value/Base64BinaryTest.java src/test/java/org/exist/xquery/value/Base64BinaryValueTypeTest.java src/test/java/org/exist/xquery/value/BifurcanMapTest.java src/main/java/org/exist/xquery/value/BinaryValue.java @@ -2367,6 +2520,7 @@ src/test/java/org/exist/xupdate/RemoveAppendTest.java src/main/java/org/exist/xupdate/Rename.java src/main/java/org/exist/xupdate/Replace.java + src/test/java/org/exist/xupdate/StressTest.java src/main/java/org/exist/xupdate/Update.java src/main/java/org/exist/xupdate/XUpdateProcessor.java src/test/java/org/exist/xupdate/XUpdateTest.java @@ -2880,4 +3034,4 @@ The BaseX Team. The original license statement is also included below.]]> - + \ No newline at end of file diff --git a/exist-core/src/main/java/org/exist/backup/Backup.java b/exist-core/src/main/java/org/exist/backup/Backup.java index 4ab112b1d3..007f6cea64 100644 --- a/exist-core/src/main/java/org/exist/backup/Backup.java +++ b/exist-core/src/main/java/org/exist/backup/Backup.java @@ -63,7 +63,12 @@ import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.Database; +import org.xmldb.api.base.ErrorCodes; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.ResourceType; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import javax.annotation.Nullable; @@ -230,12 +235,12 @@ public static void writeACLPermission(final SAXSerializer serializer, final ACLP } public void backup(final boolean guiMode, final JFrame parent) throws XMLDBException, IOException, SAXException { - final Collection current = DatabaseManager.getCollection(rootCollection.toString(), user, pass); - if (guiMode) { final BackupDialog dialog = new BackupDialog(parent, false); dialog.setSize(new Dimension(350, 150)); dialog.setVisible(true); + final Collection current = DatabaseManager.getCollection(rootCollection.toString(), user, pass); + // NOTE(AR) Transfers ownership of `current` Collection object to BackupRunnable final BackupRunnable backupRunnable = new BackupRunnable(current, dialog, this); final Thread backupThread = newBackupThread("backup-" + backupThreadId.getAndIncrement(), backupRunnable); backupThread.start(); @@ -258,7 +263,9 @@ public void backup(final boolean guiMode, final JFrame parent) throws XMLDBExcep } } } else { - backup(current, null); + try (final Collection current = DatabaseManager.getCollection(rootCollection.toString(), user, pass)) { + backup(current, null); + } } } @@ -352,126 +359,127 @@ private void backup(final Set seenBlobIds, final Collection current, fin continue; } - final Resource resource = current.getResource(resources.get(i)); + try (final Resource resource = current.getResource(resources.get(i))) { - if (dialog != null) { - dialog.setResource(resources.get(i)); - dialog.setProgress(i); - } + if (dialog != null) { + dialog.setResource(resources.get(i)); + dialog.setProgress(i); + } - // Avoid NPE - if (resource == null) { - final String msg = "Resource " + resources.get(i) + " could not be found."; + // Avoid NPE + if (resource == null) { + final String msg = "Resource " + resources.get(i) + " could not be found."; - if (dialog != null) { - Object[] options = {"Ignore", "Abort"}; - int n = JOptionPane.showOptionDialog(null, msg, "Backup Error", + if (dialog != null) { + Object[] options = {"Ignore", "Abort"}; + int n = JOptionPane.showOptionDialog(null, msg, "Backup Error", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]); - if (n == JOptionPane.YES_OPTION) { - // ignore one - continue; + if (n == JOptionPane.YES_OPTION) { + // ignore one + continue; + } + + // Abort + dialog.dispose(); + JOptionPane.showMessageDialog(null, "Backup aborted.", "Abort", JOptionPane.WARNING_MESSAGE); } - - // Abort - dialog.dispose(); - JOptionPane.showMessageDialog(null, "Backup aborted.", "Abort", JOptionPane.WARNING_MESSAGE); + throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, msg); } - throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, msg); - } - final String name = resources.get(i); - String filename = encode(URIUtils.urlDecodeUtf8(resources.get(i))); + final String name = resources.get(i); + String filename = encode(URIUtils.urlDecodeUtf8(resources.get(i))); - // Check for special resource names which cause problems as filenames, and if so, replace the filename with a generated filename + // Check for special resource names which cause problems as filenames, and if so, replace the filename with a generated filename - if (".".equals(name.trim())) { - filename = EXIST_GENERATED_FILENAME_DOT_FILENAME + i; - } else if ("..".equals(name.trim())) { - filename = EXIST_GENERATED_FILENAME_DOTDOT_FILENAME + i; - } + if (".".equals(name.trim())) { + filename = EXIST_GENERATED_FILENAME_DOT_FILENAME + i; + } else if ("..".equals(name.trim())) { + filename = EXIST_GENERATED_FILENAME_DOTDOT_FILENAME + i; + } - final OutputStream os; - if (resource instanceof ExtendedResource) { - if (deduplicateBlobs && resource instanceof EXistBinaryResource) { - // only add distinct blobs to the Blob Store once! - final String blobId = ((EXistBinaryResource) resource).getBlobId().toString(); - if (!seenBlobIds.contains(blobId)) { - os = output.newBlobEntry(blobId); + final OutputStream os; + if (resource instanceof ExtendedResource) { + if (deduplicateBlobs && resource instanceof EXistBinaryResource) { + // only add distinct blobs to the Blob Store once! + final String blobId = ((EXistBinaryResource) resource).getBlobId().toString(); + if (!seenBlobIds.contains(blobId)) { + os = output.newBlobEntry(blobId); + ((ExtendedResource) resource).getContentIntoAStream(os); + output.closeEntry(); + + seenBlobIds.add(blobId); + } + } else { + os = output.newEntry(filename); ((ExtendedResource) resource).getContentIntoAStream(os); output.closeEntry(); - - seenBlobIds.add(blobId); } } else { os = output.newEntry(filename); - ((ExtendedResource) resource).getContentIntoAStream(os); + final Writer writer = new BufferedWriter(new OutputStreamWriter(os, UTF_8)); + + // write resource to contentSerializer + final SAXSerializer contentSerializer = (SAXSerializer) SerializerPool.getInstance().borrowObject(SAXSerializer.class); + try { + contentSerializer.setOutput(writer, defaultOutputProperties); + ((EXistResource) resource).setLexicalHandler(contentSerializer); + ((XMLResource) resource).getContentAsSAX(contentSerializer); + } finally { + SerializerPool.getInstance().returnObject(contentSerializer); + } + + writer.flush(); output.closeEntry(); } - } else { - os = output.newEntry(filename); - final Writer writer = new BufferedWriter(new OutputStreamWriter(os, UTF_8)); - - // write resource to contentSerializer - final SAXSerializer contentSerializer = (SAXSerializer) SerializerPool.getInstance().borrowObject(SAXSerializer.class); - try { - contentSerializer.setOutput(writer, defaultOutputProperties); - ((EXistResource) resource).setLexicalHandler(contentSerializer); - ((XMLResource) resource).getContentAsSAX(contentSerializer); - } finally { - SerializerPool.getInstance().returnObject(contentSerializer); + final EXistResource ris = (EXistResource) resource; + + //store permissions + final ResourceType resourceType = resource.getResourceType(); + attr.clear(); + attr.addAttribute(Namespaces.EXIST_NS, "type", "type", "CDATA", resourceType.typeName()); + attr.addAttribute(Namespaces.EXIST_NS, "name", "name", "CDATA", name); + writeUnixStylePermissionAttributes(attr, perms[i]); + Instant date = ris.getCreationTime(); + + if (date != null) { + attr.addAttribute(Namespaces.EXIST_NS, "created", "created", "CDATA", "" + new DateTimeValue(date)); } + date = ris.getLastModificationTime(); - writer.flush(); - output.closeEntry(); - } - final EXistResource ris = (EXistResource) resource; - - //store permissions - final ResourceType resourceType = resource.getResourceType(); - attr.clear(); - attr.addAttribute(Namespaces.EXIST_NS, "type", "type", "CDATA", resourceType.typeName()); - attr.addAttribute(Namespaces.EXIST_NS, "name", "name", "CDATA", name); - writeUnixStylePermissionAttributes(attr, perms[i]); - Instant date = ris.getCreationTime(); - - if (date != null) { - attr.addAttribute(Namespaces.EXIST_NS, "created", "created", "CDATA", "" + new DateTimeValue(date)); - } - date = ris.getLastModificationTime(); - - if (date != null) { - attr.addAttribute(Namespaces.EXIST_NS, "modified", "modified", "CDATA", "" + new DateTimeValue(date)); - } + if (date != null) { + attr.addAttribute(Namespaces.EXIST_NS, "modified", "modified", "CDATA", "" + new DateTimeValue(date)); + } - attr.addAttribute(Namespaces.EXIST_NS, "filename", "filename", "CDATA", filename); - attr.addAttribute(Namespaces.EXIST_NS, "mimetype", "mimetype", "CDATA", encode(((EXistResource) resource).getMediaType())); + attr.addAttribute(Namespaces.EXIST_NS, "filename", "filename", "CDATA", filename); + attr.addAttribute(Namespaces.EXIST_NS, "mimetype", "mimetype", "CDATA", encode(((EXistResource) resource).getMediaType())); - if (XML_RESOURCE.equals(resourceType)) { + if (XML_RESOURCE.equals(resourceType)) { - if (ris.getDocType() != null) { + if (ris.getDocType() != null) { - if (ris.getDocType().getName() != null) { - attr.addAttribute(Namespaces.EXIST_NS, "namedoctype", "namedoctype", "CDATA", ris.getDocType().getName()); - } + if (ris.getDocType().getName() != null) { + attr.addAttribute(Namespaces.EXIST_NS, "namedoctype", "namedoctype", "CDATA", ris.getDocType().getName()); + } - if (ris.getDocType().getPublicId() != null) { - attr.addAttribute(Namespaces.EXIST_NS, "publicid", "publicid", "CDATA", ris.getDocType().getPublicId()); - } + if (ris.getDocType().getPublicId() != null) { + attr.addAttribute(Namespaces.EXIST_NS, "publicid", "publicid", "CDATA", ris.getDocType().getPublicId()); + } - if (ris.getDocType().getSystemId() != null) { - attr.addAttribute(Namespaces.EXIST_NS, "systemid", "systemid", "CDATA", ris.getDocType().getSystemId()); + if (ris.getDocType().getSystemId() != null) { + attr.addAttribute(Namespaces.EXIST_NS, "systemid", "systemid", "CDATA", ris.getDocType().getSystemId()); + } } + } else { + attr.addAttribute(Namespaces.EXIST_NS, "blob-id", "blob-id", "CDATA", ((EXistBinaryResource) ris).getBlobId().toString()); } - } else { - attr.addAttribute(Namespaces.EXIST_NS, "blob-id", "blob-id", "CDATA", ((EXistBinaryResource) ris).getBlobId().toString()); - } - serializer.startElement(Namespaces.EXIST_NS, "resource", "resource", attr); - if (perms[i] instanceof ACLPermission) { - writeACLPermission(serializer, (ACLPermission) perms[i]); + serializer.startElement(Namespaces.EXIST_NS, "resource", "resource", attr); + if (perms[i] instanceof ACLPermission) { + writeACLPermission(serializer, (ACLPermission) perms[i]); + } + serializer.endElement(Namespaces.EXIST_NS, "resource", "resource"); } - serializer.endElement(Namespaces.EXIST_NS, "resource", "resource"); } catch (final XMLDBException e) { System.err.println("Failed to backup resource " + resources.get(i) + " from collection " + current.getName()); throw e; @@ -503,14 +511,15 @@ private void backup(final Set seenBlobIds, final Collection current, fin // descend into sub-collections for (final String collection : collections) { - final Collection child = current.getChildCollection(collection); + try (final Collection child = current.getChildCollection(collection)) { + if (child.getName().equals(XmldbURI.TEMP_COLLECTION)) { + continue; + } - if (child.getName().equals(XmldbURI.TEMP_COLLECTION)) { - continue; + output.newCollection(encode(URIUtils.urlDecodeUtf8(collection))); + backup(seenBlobIds, child, output, dialog); + output.closeCollection(); } - output.newCollection(encode(URIUtils.urlDecodeUtf8(collection))); - backup(seenBlobIds, child, output, dialog); - output.closeCollection(); } } @@ -543,6 +552,12 @@ public void run() { dialog.setVisible(false); } catch (final Exception e) { e.printStackTrace(); + } finally { + try { + collection.close(); + } catch (final XMLDBException e) { + // no-op + } } } } diff --git a/exist-core/src/main/java/org/exist/backup/CreateBackupDialog.java b/exist-core/src/main/java/org/exist/backup/CreateBackupDialog.java index 5d2b92bef4..b3a8d67e52 100644 --- a/exist-core/src/main/java/org/exist/backup/CreateBackupDialog.java +++ b/exist-core/src/main/java/org/exist/backup/CreateBackupDialog.java @@ -55,6 +55,7 @@ import xyz.elemental.mediatype.MediaType; import xyz.elemental.mediatype.MediaTypeResolver; +import javax.annotation.Nullable; import javax.swing.*; import java.awt.*; import java.nio.file.Path; @@ -189,9 +190,7 @@ private void actionSelect() { private Vector getAllCollections() { final Vector list = new Vector<>(); - - try { - final Collection root = DatabaseManager.getCollection(uri + XmldbURI.ROOT_COLLECTION, user, passwd); + try (final Collection root = DatabaseManager.getCollection(uri + XmldbURI.ROOT_COLLECTION, user, passwd)) { getAllCollections(root, list); } catch (final XMLDBException e) { e.printStackTrace(); @@ -202,25 +201,37 @@ private Vector getAllCollections() { private void getAllCollections(final Collection collection, final Vector collections) throws XMLDBException { collections.add(collection.getName()); - Collection child = null; for (final String childCollection : collection.listChildCollections()) { + @Nullable Collection child = null; try { - child = collection.getChildCollection(childCollection); - } catch (final XMLDBException xmldbe) { - if (xmldbe.getCause() instanceof PermissionDeniedException) { + try { + child = collection.getChildCollection(childCollection); + } catch (final XMLDBException xmldbe) { + if (xmldbe.getCause() instanceof PermissionDeniedException) { + continue; + } else { + throw xmldbe; + } + } catch (final Exception npe) { + System.out.println("Corrupted resource/collection skipped: " + child != null ? child.getName() != null ? child.getName() : "unknown" : "unknown"); continue; - } else { - throw xmldbe; } - } catch (final Exception npe) { - System.out.println("Corrupted resource/collection skipped: " + child != null ? child.getName() != null ? child.getName() : "unknown" : "unknown"); - continue; - } - try { - getAllCollections(child, collections); - } catch (final Exception ee) { - System.out.println("Corrupted resource/collection skipped: " + child != null ? child.getName() != null ? child.getName() : "unknown" : "unknown"); - continue; + + try { + getAllCollections(child, collections); + } catch (final Exception ee) { + System.out.println("Corrupted resource/collection skipped: " + child != null ? child.getName() != null ? child.getName() : "unknown" : "unknown"); + continue; + } + } finally { + if (child != null) { + try { + child.close(); + } catch (final XMLDBException e) { + System.out.println("Unable to close collection: " + child.getName() + ". " + e.getMessage()); + + } + } } } } diff --git a/exist-core/src/main/java/org/exist/backup/Main.java b/exist-core/src/main/java/org/exist/backup/Main.java index f63f98b6f2..bf20ad4cf8 100644 --- a/exist-core/src/main/java/org/exist/backup/Main.java +++ b/exist-core/src/main/java/org/exist/backup/Main.java @@ -307,8 +307,9 @@ public static void process(final ParsedArguments arguments) { uri += XmldbURI.ROOT_COLLECTION; } - final Collection root = DatabaseManager.getCollection(uri, properties.getProperty(USER_PROP, DEFAULT_USER), optionDbaPass.orElse(optionPass)); - shutdown(root); + try (final Collection root = DatabaseManager.getCollection(uri, properties.getProperty(USER_PROP, DEFAULT_USER), optionDbaPass.orElse(optionPass))) { + shutdown(root); + } } catch (final Exception e) { reportError(e); } @@ -319,8 +320,7 @@ private static void restoreWithoutGui(final String username, final String passwo final Optional dbaPassword, final Path f, final XmldbURI uri, final boolean rebuildRepo, final boolean quiet, final boolean overwriteApps) { final AggregatingConsoleRestoreServiceTaskListener listener = new AggregatingConsoleRestoreServiceTaskListener(quiet); - try { - final Collection collection = DatabaseManager.getCollection(uri.toString(), username, password); + try (final Collection collection = DatabaseManager.getCollection(uri.toString(), username, password)) { final EXistRestoreService service = collection.getService(EXistRestoreService.class); service.restore(f.toAbsolutePath().toString(), dbaPassword.orElse(null), listener, overwriteApps); @@ -335,8 +335,7 @@ private static void restoreWithoutGui(final String username, final String passwo if (rebuildRepo) { System.out.println("Rebuilding application repository ..."); System.out.println("URI: " + uri); - try { - final Collection root = DatabaseManager.getCollection(uri.toString(), username, dbaPassword.orElse(password)); + try (final Collection root = DatabaseManager.getCollection(uri.toString(), username, dbaPassword.orElse(password))) { if (root != null) { ClientFrame.repairRepository(root); System.out.println("Application repository rebuilt successfully."); @@ -412,8 +411,7 @@ private static void restoreWithGui(final String username, final String password, final Callable callable = () -> { - try { - final Collection collection = DatabaseManager.getCollection(uri.toString(), username, password); + try (final Collection collection = DatabaseManager.getCollection(uri.toString(), username, password)) { final EXistRestoreService service = collection.getService(EXistRestoreService.class); service.restore(f.toAbsolutePath().toString(), dbaPassword.orElse(null), listener, overwriteApps); @@ -422,8 +420,7 @@ private static void restoreWithGui(final String username, final String password, if (JOptionPane.showConfirmDialog(null, "Would you like to rebuild the application repository?\nThis is only necessary if application packages were restored.", "Rebuild App Repository?", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { System.out.println("Rebuilding application repository ..."); - try { - final Collection root = DatabaseManager.getCollection(uri.toString(), username, dbaPassword.orElse(password)); + try (final Collection root = DatabaseManager.getCollection(uri.toString(), username, dbaPassword.orElse(password))) { ClientFrame.repairRepository(root); listener.info("Application repository rebuilt successfully."); } catch (final XMLDBException e) { diff --git a/exist-core/src/main/java/org/exist/client/ClientFrame.java b/exist-core/src/main/java/org/exist/client/ClientFrame.java index 52547f6fbb..4dbbf6770c 100644 --- a/exist-core/src/main/java/org/exist/client/ClientFrame.java +++ b/exist-core/src/main/java/org/exist/client/ClientFrame.java @@ -443,7 +443,7 @@ private JMenuBar createMenuBar() { item = new JMenuItem(Messages.getString("ClientFrame.62a")); item.addActionListener(e -> { try { - final DatabaseInstanceManager service = client.current.getService(DatabaseInstanceManager.class); + final DatabaseInstanceManager service = client.getCollection().getService(DatabaseInstanceManager.class); service.enterServiceMode(); } catch (final XMLDBException ex) { showErrorMessage(ex.getMessage(), ex); @@ -454,7 +454,7 @@ private JMenuBar createMenuBar() { item = new JMenuItem(Messages.getString("ClientFrame.62b")); item.addActionListener(e -> { try { - final DatabaseInstanceManager service = client.current.getService(DatabaseInstanceManager.class); + final DatabaseInstanceManager service = client.getCollection().getService(DatabaseInstanceManager.class); service.exitServiceMode(); } catch (final XMLDBException ex) { showErrorMessage(ex.getMessage(), ex); @@ -737,7 +737,7 @@ private ResourceDescriptor[] getSelectedResources() { private void removeAction(final ActionEvent ev) { final ResourceDescriptor[] res = getSelectedResources(); - final Collection removeRootCollection = client.current; + final Collection removeRootCollection = client.getCollection(); // String cmd; if (JOptionPane.showConfirmDialog(this, Messages.getString("ClientFrame.104") + Messages.getString("ClientFrame.105"), //$NON-NLS-1$ //$NON-NLS-2$ @@ -758,9 +758,7 @@ private void removeAction(final ActionEvent ev) { showErrorMessage(e.getMessage(), e); } } else { - try { - final Resource res1 = removeRootCollection - .getResource(resource.getName().toString()); + try (final Resource res1 = removeRootCollection.getResource(resource.getName().toString())) { removeRootCollection.removeResource(res1); } catch (final XMLDBException e) { showErrorMessage(e.getMessage(), e); @@ -791,11 +789,9 @@ private void moveAction(final ActionEvent ev) { PrettyXmldbURI[] collections; //get an array of collection paths - try { - final Collection root = client.getCollection(XmldbURI.ROOT_COLLECTION); - final List alCollections = getCollections(root, new ArrayList<>()); - collections = new PrettyXmldbURI[alCollections.size()]; - alCollections.toArray(collections); + try (final Collection root = client.getCollection(XmldbURI.ROOT_COLLECTION)) { + final List collectionUris = getCollections(root, new ArrayList<>()); + collections = collectionUris.toArray(new PrettyXmldbURI[0]); } catch (final XMLDBException e) { showErrorMessage(e.getMessage(), e); return; @@ -810,7 +806,7 @@ private void moveAction(final ActionEvent ev) { final XmldbURI destinationPath = ((PrettyXmldbURI) val).getTargetURI(); final Runnable moveTask = () -> { try { - final EXistCollectionManagementService service = client.current.getService(EXistCollectionManagementService.class); + final EXistCollectionManagementService service = client.getCollection().getService(EXistCollectionManagementService.class); for (ResourceDescriptor re : res) { setStatus(Messages.getString("ClientFrame.115") + re.getName() + Messages.getString("ClientFrame.116") + destinationPath + Messages.getString("ClientFrame.117")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ if (re.isCollection()) { @@ -851,7 +847,7 @@ private void renameAction(final ActionEvent ev) { final XmldbURI destinationFilename = parseIt; final Runnable renameTask = () -> { try { - final EXistCollectionManagementService service = client.current.getService(EXistCollectionManagementService.class); + final EXistCollectionManagementService service = client.getCollection().getService(EXistCollectionManagementService.class); boolean changed = false; for (final ResourceDescriptor re : res) { if (!re.getName().equals(destinationFilename)) { @@ -881,11 +877,9 @@ private void copyAction(final ActionEvent ev) { PrettyXmldbURI[] collections; //get an array of collection paths - try { - final Collection root = client.getCollection(XmldbURI.ROOT_COLLECTION); - final List alCollections = getCollections(root, new ArrayList<>()); - collections = new PrettyXmldbURI[alCollections.size()]; - alCollections.toArray(collections); + try (final Collection root = client.getCollection(XmldbURI.ROOT_COLLECTION)) { + final List collectionUris = getCollections(root, new ArrayList<>()); + collections = collectionUris.toArray(new PrettyXmldbURI[0]); } catch (final XMLDBException e) { showErrorMessage(e.getMessage(), e); return; @@ -901,7 +895,7 @@ private void copyAction(final ActionEvent ev) { final Runnable moveTask = () -> { try { - final EXistCollectionManagementService service = client.current.getService(EXistCollectionManagementService.class); + final EXistCollectionManagementService service = client.getCollection().getService(EXistCollectionManagementService.class); for (ResourceDescriptor re : res) { //TODO @@ -929,27 +923,38 @@ private void copyAction(final ActionEvent ev) { client.newClientThread("move", moveTask).start(); } - private ArrayList getCollections(final Collection root, final ArrayList collectionsList) throws XMLDBException { + static List getCollections(final Collection root, final List collectionsList) throws XMLDBException { collectionsList.add(new PrettyXmldbURI(XmldbURI.create(root.getName()))); - Collection child = null; - for (String childCollection : root.listChildCollections()) { + for (final String childCollection : root.listChildCollections()) { + @Nullable Collection child = null; try { - child = root.getChildCollection(childCollection); - } catch (final XMLDBException xmldbe) { - if (xmldbe.getCause() instanceof PermissionDeniedException) { + try { + child = root.getChildCollection(childCollection); + } catch (final XMLDBException e) { + if (e.getCause() instanceof PermissionDeniedException) { + continue; + } else { + throw e; + } + } catch (final Exception e) { + System.out.println("Corrupted resource/collection skipped: " + child != null ? child.getName() != null ? child.getName() : "unknown" : "unknown"); continue; - } else { - throw xmldbe; } - } catch (Exception npe) { - System.out.println("Corrupted resource/collection skipped: " + child != null ? child.getName() != null ? child.getName() : "unknown" : "unknown"); - continue; - } - try { - getCollections(child, collectionsList); - } catch (Exception ee) { - System.out.println("Corrupted resource/collection skipped: " + child != null ? child.getName() != null ? child.getName() : "unknown" : "unknown"); - continue; + + try { + getCollections(child, collectionsList); + } catch (final Exception e) { + System.out.println("Corrupted resource/collection skipped: " + child != null ? child.getName() != null ? child.getName() : "unknown" : "unknown"); + continue; + } + } finally { + if (child != null) { + try { + child.close(); + } catch (final XMLDBException e) { + System.out.println("Unable to close collection: " + child.getName() + ". " + e.getMessage()); + } + } } } return collectionsList; @@ -960,7 +965,7 @@ private void reindexAction(final ActionEvent ev) { final ResourceDescriptor[] res; if (selRows.length == 0) { res = new ResourceDescriptor[1]; - res[0] = new ResourceDescriptor.Collection(client.path); + res[0] = new ResourceDescriptor.Collection(client.getPath()); } else { res = new ResourceDescriptor[selRows.length]; @@ -981,7 +986,7 @@ private void reindexAction(final ActionEvent ev) { ClientFrame.this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); final IndexQueryService service; try { - service = client.current.getService(IndexQueryService.class); + service = client.getCollection().getService(IndexQueryService.class); for (final ResourceDescriptor next : collections) { setStatus(Messages.getString("ClientFrame.142") + next.getName() + Messages.getString("ClientFrame.143")); //$NON-NLS-1$ //$NON-NLS-2$ service.reindexCollection(next.getName()); @@ -1138,9 +1143,10 @@ private void doRestore(final GuiRestoreServiceTaskListener listener, final Strin dbUri = XmldbURI.xmldbUriFor(uri); } - final Collection collection = DatabaseManager.getCollection(dbUri.toString(), username, password); - final EXistRestoreService service = collection.getService(EXistRestoreService.class); - service.restore(f.toAbsolutePath().toString(), dbaPassword, listener, overwriteApps); + try (final Collection collection = DatabaseManager.getCollection(dbUri.toString(), username, password)) { + final EXistRestoreService service = collection.getService(EXistRestoreService.class); + service.restore(f.toAbsolutePath().toString(), dbaPassword, listener, overwriteApps); + } if (JOptionPane.showConfirmDialog(null, Messages.getString("ClientFrame.223"), Messages.getString("ClientFrame.224"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { @@ -1224,7 +1230,7 @@ private void exportAction(final ActionEvent ev) { JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) { return; } - final Resource resource; + Resource resource = null; final SAXSerializer contentSerializer; try { final Collection collection = client.getCollection(); @@ -1253,6 +1259,14 @@ private void exportAction(final ActionEvent ev) { } catch (final Exception e) { System.err.println("An exception occurred" + e.getMessage()); e.printStackTrace(); + } finally { + if (resource != null) { + try { + resource.close(); + } catch (final XMLDBException e) { + // no-op + } + } } } } @@ -1312,30 +1326,32 @@ private void setPermAction(final ActionEvent ev) throws PermissionDeniedExceptio final Permission thisPerm; if (selectedRow.isCollection()) { - final Collection coll = collection.getChildCollection(thisName.toString()); - thisCreated = DATE_TIME_FORMATTER.format(coll.getCreationTime()); - thisModified = NON_APPLICABLE; - thisMimeType = COLLECTION_MIME_TYPE; - thisMessageDigestType = NON_APPLICABLE; - thisMessageDigestValue = NON_APPLICABLE; - thisSize = NON_APPLICABLE; - thisPerm = service.getPermissions(coll); - } else { - final Resource res = collection.getResource(thisName.toString()); - thisCreated = DATE_TIME_FORMATTER.format(res.getCreationTime()); - thisModified = DATE_TIME_FORMATTER.format(res.getLastModificationTime()); - thisMimeType = ((EXistResource) res).getMediaType(); - if (res instanceof EXistBinaryResource) { - final MessageDigest messageDigest = ((EXistBinaryResource) res).getContentDigest(DigestType.BLAKE_256); - thisMessageDigestType = messageDigest.getDigestType().getCommonNames()[0]; - thisMessageDigestValue = messageDigest.toHexString(); - thisSize = humanSize(((EXistBinaryResource) res).getContentLength()); - } else { + try (final Collection coll = collection.getChildCollection(thisName.toString())) { + thisCreated = DATE_TIME_FORMATTER.format(coll.getCreationTime()); + thisModified = NON_APPLICABLE; + thisMimeType = COLLECTION_MIME_TYPE; thisMessageDigestType = NON_APPLICABLE; thisMessageDigestValue = NON_APPLICABLE; thisSize = NON_APPLICABLE; + thisPerm = service.getPermissions(coll); + } + } else { + try (final Resource res = collection.getResource(thisName.toString())) { + thisCreated = DATE_TIME_FORMATTER.format(res.getCreationTime()); + thisModified = DATE_TIME_FORMATTER.format(res.getLastModificationTime()); + thisMimeType = ((EXistResource) res).getMediaType(); + if (res instanceof EXistBinaryResource) { + final MessageDigest messageDigest = ((EXistBinaryResource) res).getContentDigest(DigestType.BLAKE_256); + thisMessageDigestType = messageDigest.getDigestType().getCommonNames()[0]; + thisMessageDigestValue = messageDigest.toHexString(); + thisSize = humanSize(((EXistBinaryResource) res).getContentLength()); + } else { + thisMessageDigestType = NON_APPLICABLE; + thisMessageDigestValue = NON_APPLICABLE; + thisSize = NON_APPLICABLE; + } + thisPerm = service.getPermissions(res); } - thisPerm = service.getPermissions(res); } name = getUpdated(name, () -> URIUtils.urlDecodeUtf8(thisName)); @@ -1478,7 +1494,7 @@ private void enter() { doc.insertString(commandStart++, "\n", defaultAttrs); //$NON-NLS-1$ if (command != null) { processRunnable.setAction(command); - client.console.getHistory().add(command); + client.getConsole().getHistory().add(command); } } catch (final BadLocationException e) { e.printStackTrace(); @@ -1486,8 +1502,8 @@ private void enter() { } private void historyBack() { - client.console.getHistory().previous(); - final String item = client.console.getHistory().current(); + client.getConsole().getHistory().previous(); + final String item = client.getConsole().getHistory().current(); if (item == null) { return; } @@ -1502,8 +1518,8 @@ private void historyBack() { } private void historyForward() { - client.console.getHistory().next(); - final String item = client.console.getHistory().current(); + client.getConsole().getHistory().next(); + final String item = client.getConsole().getHistory().current(); try { if (shell.getCaretPosition() > commandStart) { doc.remove(commandStart, doc.getLength() - commandStart); @@ -1541,9 +1557,7 @@ public void mouseClicked(final MouseEvent e) { } else { // open a document for editing ClientFrame.this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - try { - final Resource doc = client.retrieve(resource.getName(), properties.getProperty(OutputKeys.INDENT, "yes")); //$NON-NLS-1$ - + try (final Resource doc = client.retrieve(resource.getName(), properties.getProperty(OutputKeys.INDENT, "yes"))) { if (MediaType.APPLICATION_XQUERY.equals(((EXistResource) doc).getMediaType())) { final Collection collection = client.getCollection(); final QueryDialog dialog = new QueryDialog(client, collection, doc, properties); @@ -1553,7 +1567,6 @@ public void mouseClicked(final MouseEvent e) { view.setSize(new Dimension(640, 400)); view.viewDocument(); } - //doc will be closed in one of the dialogs above when they are closed } catch (final XMLDBException ex) { showErrorMessage(Messages.getString("ClientFrame.206") + ex.getMessage(), ex); //$NON-NLS-1$ } diff --git a/exist-core/src/main/java/org/exist/client/CollectionXConf.java b/exist-core/src/main/java/org/exist/client/CollectionXConf.java index 6f13ce68c0..3ec9de9bcc 100644 --- a/exist-core/src/main/java/org/exist/client/CollectionXConf.java +++ b/exist-core/src/main/java/org/exist/client/CollectionXConf.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,7 +46,9 @@ package org.exist.client; import java.io.IOException; +import java.io.InputStream; import java.util.*; +import javax.annotation.Nullable; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -49,20 +75,20 @@ * @serial 2006-08-25 * @version 1.2 */ -public class CollectionXConf -{ +public class CollectionXConf { - public final static String TYPE_QNAME = "qname"; - public final static String TYPE_PATH = "path"; + public static final String TYPE_QNAME = "qname"; + public static final String TYPE_PATH = "path"; - private InteractiveClient client = null; //the client - private String path = null; //path of the collection.xconf file - Collection collection = null; //the configuration collection - Resource resConfig = null; //the collection.xconf resource - - private LinkedHashMap customNamespaces = null; //custom namespaces - private RangeIndex[] rangeIndexes = null; //range indexes model - private Trigger[] triggers = null; //triggers model + private final InteractiveClient client; //the client + private final String path; //path of the collection.xconf file + private final boolean collectionExists; + private final boolean resourceExists; + + + private @Nullable LinkedHashMap customNamespaces = null; //custom namespaces + private @Nullable RangeIndex[] rangeIndexes = null; //range indexes model + private @Nullable Trigger[] triggers = null; //triggers model private boolean hasChanged = false; //indicates if changes have been made to the current collection configuration @@ -70,60 +96,81 @@ public class CollectionXConf /** * Constructor * - * @param CollectionName The path of the collection to retreive the collection.xconf for - * @param client The interactive client + * @param collectionName The path of the collection to retrieve the collection.xconf for + * @param client The interactive client */ - CollectionXConf(String CollectionName, InteractiveClient client) throws XMLDBException - { + CollectionXConf(final String collectionName, final InteractiveClient client) throws XMLDBException { this.client = client; - //get configuration collection for the named collection - //TODO : use XmldbURIs - path = CollectionConfigurationManager.CONFIG_COLLECTION + CollectionName; - collection = client.getCollection(path); - - if(collection == null) //if no config collection for this collection exists, just return - {return;} - - //get the resource from the db - for (String resource : collection.listResources()) { - if (resource.endsWith(CollectionConfiguration.COLLECTION_CONFIG_SUFFIX)) { - resConfig = collection.getResource(resource); - if (BINARY_RESOURCE.equals(resConfig.getResourceType())) { - System.err.println("Found a possible Collection configuration document: " + resConfig.getId() + ", however it is a Binary document! A user may have stored the document as a Binary document by mistake. Skipping..."); - continue; + // get configuration collection for the named collection + this.path = CollectionConfigurationManager.CONFIG_COLLECTION + collectionName; + + try (final Collection collection = client.getCollection(path)) { + + if (collection == null) { + // if no config collection for this collection exists, just return + this.collectionExists = false; + this.resourceExists = false; + return; + } + this.collectionExists = true; + + // get the resource from the db + @Nullable Resource resConfig = null; + try { + for (final String resource : collection.listResources()) { + if (resource.endsWith(CollectionConfiguration.COLLECTION_CONFIG_SUFFIX)) { + resConfig = collection.getResource(resource); + if (BINARY_RESOURCE.equals(resConfig.getResourceType())) { + System.err.println("Found a possible Collection configuration document: " + resConfig.getId() + ", however it is a Binary document! A user may have stored the document as a Binary document by mistake. Skipping..."); + continue; + } + break; + } + } + + if (resConfig == null) { + // if, no config file exists for that collection + this.resourceExists = false; + return; + } + this.resourceExists = true; + + // Parse the configuration file into a DOM + final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + @Nullable Document docConfig = null; + try { + final DocumentBuilder builder = factory.newDocumentBuilder(); + try (final InputStream is = new UnsynchronizedByteArrayInputStream(resConfig.getContent().toString().getBytes())) { + docConfig = builder.parse(is); + } + } catch (final ParserConfigurationException | SAXException | IOException pce) { + System.err.println("Found a possible Collection configuration document: " + resConfig.getId() + ", however could not be parsed!" + pce.getMessage()); + } + + if (docConfig == null) { + // if, no config document could be parsed for that collection + return; + } + + // Get the root of the collection.xconf + final Element xconf = docConfig.getDocumentElement(); + + // Read any custom namespaces from xconf + this.customNamespaces = getCustomNamespaces(xconf); + + // Read Range Indexes from xconf + this.rangeIndexes = getRangeIndexes(xconf); + + // Read Triggers from xconf + this.triggers = getTriggers(xconf); + + } finally { + if (resConfig != null) { + resConfig.close(); } - break; } } - - if(resConfig == null) //if, no config file exists for that collection - {return;} - - //Parse the configuration file into a DOM - final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - Document docConfig = null; - try - { - final DocumentBuilder builder = factory.newDocumentBuilder(); - docConfig = builder.parse( new UnsynchronizedByteArrayInputStream(resConfig.getContent().toString().getBytes()) ); - } - catch(final ParserConfigurationException | SAXException | IOException pce) - { - //TODO: do something here, throw exception? - } - - //Get the root of the collection.xconf - final Element xconf = docConfig.getDocumentElement(); - - //Read any custom namespaces from xconf - customNamespaces = getCustomNamespaces(xconf); - - //Read Range Indexes from xconf - rangeIndexes = getRangeIndexes(xconf); - - //read Triggers from xconf - triggers = getTriggers(xconf); } /** @@ -216,10 +263,10 @@ public void updateRangeIndex(int index, String type, String XPath, String xsType {rangeIndexes[index].setType(type);} if(XPath != null) - {rangeIndexes[index].setXPath(XPath);} + {rangeIndexes[index].setXpath(XPath);} if(xsType != null) - {rangeIndexes[index].setxsType(xsType);} + {rangeIndexes[index].setXsType(xsType);} } /** @@ -527,38 +574,37 @@ private String toXMLString() * * @return true if the save succeeds, false otherwise */ - public boolean Save() - { - try - { - //is there an existing config file? - if(resConfig == null) - { - //no - - //is there an existing configuration collection? - if(collection == null) - { - //no - client.process("mkcol " + path); - collection = client.getCollection(path); + public boolean save() { + if (!collectionExists) { + client.process("mkcol " + path); + } + + try (final Collection collection = client.getCollection(path)) { + @Nullable Resource resConfig = null; + try { + if (resourceExists) { + resConfig = collection.getResource(CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE); + } else { + resConfig = collection.createResource(CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE, XMLResource.class); + } + + // set the content of the collection.xconf + resConfig.setContent(toXMLString()); + + //s tore the collection.xconf + collection.storeResource(resConfig); + + } finally { + if (resConfig != null) { + resConfig.close(); } - - resConfig = collection.createResource(CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE, XMLResource.class); } - - //set the content of the collection.xconf - resConfig.setContent(toXMLString()); - - //store the collection.xconf - collection.storeResource(resConfig); - } - catch(final XMLDBException xmldbe) - { + + return true; + + } catch (final XMLDBException e) { return false; } - - return true; } /** @@ -566,30 +612,28 @@ public boolean Save() */ protected class RangeIndex { - private String type = TYPE_QNAME; - private String XPath = null; - private String xsType = null; + private String type; + private String xpath; + private String xsType; /** * Constructor * * @param type type of the index, either "qname" or "path" - * @param XPath The XPath to create a range index on + * @param xpath The XPath to create a range index on * @param xsType The data type pointed to by the XPath as an xs:type */ - RangeIndex(String type, String XPath, String xsType) - { + RangeIndex(final String type, final String xpath, final String xsType) { this.type = type; - this.XPath = XPath; + this.xpath = xpath; this.xsType = xsType; } - public String getXPath() - { - return(XPath); + public String getXpath() { + return xpath; } - public String getxsType() + public String getXsType() { return(xsType); } @@ -598,30 +642,28 @@ public String getType() { return type; } - public void setXPath(String XPath) - { - this.XPath = XPath; + public void setXpath(final String xpath) { + this.xpath = xpath; } - public void setxsType(String xsType) - { + public void setXsType(final String xsType) { this.xsType = xsType; } - public void setType(String type) { + public void setType(final String type) { this.type = type; } //produces a collection.xconf suitable string of XML describing the range index - protected String toXMLString() - { + protected String toXMLString() { final StringBuilder range = new StringBuilder(); - if (TYPE_PATH.equals(type)) - {range.append(""); @@ -633,10 +675,9 @@ protected String toXMLString() /** * Represents a Trigger in the collection.xconf */ - protected static class Trigger - { + protected static class Trigger { private String triggerClass = null; - private Properties parameters = null; + private final Properties parameters; /** * Constructor @@ -644,39 +685,32 @@ protected static class Trigger * @param triggerClass The fully qualified java class name of the trigger * @param parameters Properties describing any name=value parameters for the trigger */ - Trigger(final String triggerClass, final Properties parameters) - { + Trigger(final String triggerClass, final Properties parameters) { this.triggerClass = triggerClass; this.parameters = parameters; } - public String getTriggerClass() - { + public String getTriggerClass() { return triggerClass; } - public void setTriggerClass(String triggerClass) - { + public void setTriggerClass(final String triggerClass) { this.triggerClass = triggerClass; } //produces a collection.xconf suitable string of XML describing the trigger - protected String toXMLString() - { + protected String toXMLString() { final StringBuilder trigger = new StringBuilder(); - if(!"".equals(triggerClass)) - { + if(!"".equals(triggerClass)) { trigger.append(""); //parameters if any - if(parameters != null) - { - if(parameters.size() > 0) - { + if(parameters != null) { + if(parameters.size() > 0) { for (Object o : parameters.keySet()) { final String name = (String) o; final String value = parameters.getProperty(name); diff --git a/exist-core/src/main/java/org/exist/client/DocumentView.java b/exist-core/src/main/java/org/exist/client/DocumentView.java index bd752fee5a..0535c4bd25 100644 --- a/exist-core/src/main/java/org/exist/client/DocumentView.java +++ b/exist-core/src/main/java/org/exist/client/DocumentView.java @@ -73,7 +73,6 @@ import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; -import javax.swing.JPopupMenu; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; @@ -107,25 +106,26 @@ class DocumentView extends JFrame { private static final long serialVersionUID = 1L; - protected InteractiveClient client; - private XmldbURI resourceName; - protected Resource resource; - protected Collection collection; - protected boolean readOnly = false; - protected RSyntaxTextArea text; - protected RTextScrollPane textScrollPane; - protected JButton saveButton; - protected JButton saveAsButton; - protected JTextField statusMessage; - protected JTextField positionDisplay; - protected JProgressBar progress; - protected JPopupMenu popup; - protected Properties properties; - - public DocumentView(InteractiveClient client, XmldbURI resourceName, Resource resource, Properties properties) throws XMLDBException { + private final InteractiveClient client; + private final XmldbURI resourceName; + private Resource resource; + private boolean ownsResource; + private final Collection collection; + private boolean readOnly = false; + private RSyntaxTextArea text; + private RTextScrollPane textScrollPane; + private JButton saveButton; + private JButton saveAsButton; + private JTextField statusMessage; + private JTextField positionDisplay; + private JProgressBar progress; + private Properties properties; + + public DocumentView(final InteractiveClient client, final XmldbURI resourceName, final Resource resource, final Properties properties) throws XMLDBException { super(URIUtils.urlDecodeUtf8(resourceName.lastSegment())); this.resourceName = resourceName; this.resource = resource; + this.ownsResource = false; this.client = client; this.setIconImage(InteractiveClient.getElementalIcon(getClass()).getImage()); this.collection = client.getCollection(); @@ -150,7 +150,7 @@ public void viewDocument() { } // lock the resource for editing - final UserManagementService service = client.current.getService(UserManagementService.class); + final UserManagementService service = client.getCollection().getService(UserManagementService.class); final Account user = service.getAccount(properties.getProperty("user")); //$NON-NLS-1$ final String lockOwner = service.hasUserLock(resource); if (lockOwner != null) { @@ -217,6 +217,13 @@ public void setReadOnly() { private void close() { unlockView(); + if (this.ownsResource) { + try { + this.resource.close(); + } catch (final XMLDBException e) { + // no-op + } + } } private void unlockView() { @@ -409,10 +416,10 @@ private void saveAs() { progress.setVisible(true); //Create a new resource as named, set the content, store the resource - XMLResource result = null; - result = collection.createResource(URIUtils.encodeXmldbUriFor(nameres).toString(), XMLResource.class); - result.setContent(text.getText()); - collection.storeResource(result); + try (final XMLResource result = collection.createResource(URIUtils.encodeXmldbUriFor(nameres).toString(), XMLResource.class)) { + result.setContent(text.getText()); + collection.storeResource(result); + } client.reloadCollection(); //reload the client collection if (collection instanceof Observable) { ((Observable) collection).deleteObservers(); @@ -464,7 +471,15 @@ private void refresh() throws XMLDBException { unlockView(); //Reload the resource + if (this.ownsResource) { + try { + this.resource.close(); + } catch (final XMLDBException e) { + // no-op + } + } this.resource = client.retrieve(resourceName, properties.getProperty(OutputKeys.INDENT, "yes")); //$NON-NLS-1$ + this.ownsResource = true; //View and lock the resource viewDocument(); diff --git a/exist-core/src/main/java/org/exist/client/IndexDialog.java b/exist-core/src/main/java/org/exist/client/IndexDialog.java index 9950cc6be0..b8a630788d 100644 --- a/exist-core/src/main/java/org/exist/client/IndexDialog.java +++ b/exist-core/src/main/java/org/exist/client/IndexDialog.java @@ -51,16 +51,31 @@ import org.xmldb.api.base.Collection; import org.xmldb.api.base.XMLDBException; -import javax.swing.*; +import javax.swing.Box; +import javax.swing.DefaultCellEditor; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.ListSelectionModel; import javax.swing.border.TitledBorder; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; -import java.awt.*; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.ArrayList; +import java.util.List; /** * Dialog for viewing and editing Indexes in the Admin Client @@ -140,21 +155,16 @@ private void setupComponents() grid.setConstraints(label, c); getContentPane().add(label); - //get the collections but not system collections - final ArrayList alCollections = new ArrayList(); - try - { - final Collection root = client.getCollection(XmldbURI.ROOT_COLLECTION); - final ArrayList alAllCollections = getCollections(root, new ArrayList()); - for (Object alAllCollection : alAllCollections) { - //TODO : use XmldbURIs ! - if (alAllCollection.toString().contains(CollectionConfigurationManager.CONFIG_COLLECTION)) { - alCollections.add(alAllCollection); + // get the collections but not system collections + final List alCollections = new ArrayList<>(); + try (final Collection root = client.getCollection(XmldbURI.ROOT_COLLECTION)) { + final List collectionUris = ClientFrame.getCollections(root, new ArrayList<>()); + for (final PrettyXmldbURI collectionUri : collectionUris) { + if (collectionUri.toString().contains(CollectionConfigurationManager.CONFIG_COLLECTION)) { + alCollections.add(collectionUri); } } - } - catch (final XMLDBException e) - { + } catch (final XMLDBException e) { //showErrorMessage(e.getMessage(), e); return; } @@ -283,7 +293,7 @@ private void saveChanges(boolean ask) if(doSave) { //save the collection.xconf changes - if(cx.Save()) + if(cx.save()) { //save ok, reindex? final int result = JOptionPane.showConfirmDialog(getContentPane(), "Your changes have been saved, but will not take effect until the collection is reindexed!\n Would you like to reindex " + cmbCollections.getSelectedItem() + " and sub-collections now?", "Reindex", JOptionPane.YES_NO_OPTION); @@ -294,13 +304,15 @@ private void saveChanges(boolean ask) final Runnable reindexThread = () -> { try { - IndexQueryService service = client.current.getService(IndexQueryService.class); + IndexQueryService service = client.getCollection().getService(IndexQueryService.class); - ArrayList subCollections = getCollections(client.getCollection((String)cmbCollections.getSelectedItem()), new ArrayList()); + try (final Collection collection = client.getCollection((String)cmbCollections.getSelectedItem())) { + final List subCollections = ClientFrame.getCollections(collection, new ArrayList<>()); - for (Object subCollection : subCollections) { - service.reindexCollection(((ResourceDescriptor) subCollection).getName()); - } + for (final PrettyXmldbURI subCollection : subCollections) { + service.reindexCollection(subCollection.getTargetURI()); + } + } //reindex done JOptionPane.showMessageDialog(getContentPane(), "Reindex Complete"); @@ -321,20 +333,6 @@ private void saveChanges(boolean ask) } } } - - - //THIS IS A COPY FROM ClientFrame - //TODO: share this code between the two classes - private ArrayList getCollections(Collection root, ArrayList collectionsList) throws XMLDBException - { - collectionsList.add(new PrettyXmldbURI(XmldbURI.create(root.getName()))); - Collection child; - for (String childCollection : root.listChildCollections()) { - child = root.getChildCollection(childCollection); - getCollections(child, collectionsList); - } - return collectionsList; - } private void actionAddRangeIndex() { @@ -492,9 +490,9 @@ public Object getValueAt(int rowIndex, int columnIndex) return switch (columnIndex) { case 0 -> cx.getRangeIndex(rowIndex).getType(); case 1 -> /* XPath */ - cx.getRangeIndex(rowIndex).getXPath(); + cx.getRangeIndex(rowIndex).getXpath(); case 2 -> /* xsType */ - cx.getRangeIndex(rowIndex).getxsType(); + cx.getRangeIndex(rowIndex).getXsType(); default -> null; }; } diff --git a/exist-core/src/main/java/org/exist/client/InteractiveClient.java b/exist-core/src/main/java/org/exist/client/InteractiveClient.java index 3b301b6855..9b2d476285 100644 --- a/exist-core/src/main/java/org/exist/client/InteractiveClient.java +++ b/exist-core/src/main/java/org/exist/client/InteractiveClient.java @@ -89,14 +89,7 @@ import org.exist.util.*; import org.exist.util.serializer.SAXSerializer; import org.exist.util.serializer.SerializerPool; -import org.exist.xmldb.EXistCollectionManagementService; -import org.exist.xmldb.DatabaseInstanceManager; -import org.exist.xmldb.EXistResource; -import org.exist.xmldb.ExtendedResource; -import org.exist.xmldb.IndexQueryService; -import org.exist.xmldb.UserManagementService; -import org.exist.xmldb.EXistXPathQueryService; -import org.exist.xmldb.XmldbURI; +import org.exist.xmldb.*; import org.exist.xquery.Constants; import org.jline.reader.*; import org.jline.reader.impl.history.DefaultHistory; @@ -109,9 +102,13 @@ import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Database; +import org.xmldb.api.base.ErrorCodes; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.base.Collection; import org.xmldb.api.modules.BinaryResource; +import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XUpdateQueryService; import se.softhouse.jargo.ArgumentException; @@ -164,15 +161,15 @@ public class InteractiveClient { public static final String NO_AUTO_DEPLOY = "no-autodeploy"; // values - protected static final String EDIT_CMD = "emacsclient -t $file"; - protected static final Charset ENCODING_DEFAULT = StandardCharsets.UTF_8; - protected static final String URI_DEFAULT = "xmldb:exist://localhost:8080/exist/xmlrpc"; - protected static final String SSL_ENABLE_DEFAULT = "FALSE"; - protected static final String LOCAL_MODE_DEFAULT = "FALSE"; - protected static final String NO_EMBED_MODE_DEFAULT = "FALSE"; - protected static final String NO_AUTO_DEPLOY_DEFAULT = "FALSE"; - protected static final String USER_DEFAULT = SecurityManager.DBA_USER; - protected static final String DRIVER_IMPL_CLASS = "org.exist.xmldb.DatabaseImpl"; + private static final String EDIT_CMD = "emacsclient -t $file"; + private static final Charset ENCODING_DEFAULT = StandardCharsets.UTF_8; + static final String URI_DEFAULT = "xmldb:exist://localhost:8080/exist/xmlrpc"; + static final String SSL_ENABLE_DEFAULT = "FALSE"; + static final String LOCAL_MODE_DEFAULT = "FALSE"; + static final String NO_EMBED_MODE_DEFAULT = "FALSE"; + private static final String NO_AUTO_DEPLOY_DEFAULT = "FALSE"; + static final String USER_DEFAULT = SecurityManager.DBA_USER; + private static final String DRIVER_IMPL_CLASS = "org.exist.xmldb.DatabaseImpl"; // Set properties private static final Properties DEFAULT_PROPERTIES = new Properties(); @@ -192,55 +189,52 @@ public class InteractiveClient { DEFAULT_PROPERTIES.setProperty(SSL_ENABLE, SSL_ENABLE_DEFAULT); DEFAULT_PROPERTIES.setProperty(NO_AUTO_DEPLOY, NO_AUTO_DEPLOY_DEFAULT); } - protected static final int[] COL_SIZES = new int[]{10, 10, 10, -1}; - protected static String configuration = null; + private final TreeSet completions = new TreeSet<>(); + private final List queryHistory = new LinkedList<>(); + private final Properties properties = new Properties(DEFAULT_PROPERTIES); + private final Map namespaceMappings = new HashMap<>(); - protected final TreeSet completions = new TreeSet<>(); - protected final LinkedList queryHistory = new LinkedList<>(); - protected final Properties properties = new Properties(DEFAULT_PROPERTIES); - protected final Map namespaceMappings = new HashMap<>(); + private Path queryHistoryFile; + private Path historyFile; - protected Path queryHistoryFile; - protected Path historyFile; + private @Nullable LineReader console = null; - protected LineReader console = null; + private @Nullable Database database = null; + private @Nullable Collection current = null; + private int nextInSet = 1; - private Database database = null; - protected Collection current = null; - protected int nextInSet = 1; - - protected String[] resources = null; - protected ResourceSet result = null; + private @Nullable String[] resources = null; + private @Nullable EXistResourceSet result = null; /** * number of files of a recursive store */ - protected int filesCount = 0; + private int filesCount = 0; /** * total length of a recursive store */ - protected long totalLength = 0; + private long totalLength = 0; - protected ClientFrame frame; + ClientFrame frame; //************************************* private final CommandlineOptions options; - protected XmldbURI path = XmldbURI.ROOT_COLLECTION_URI; + private XmldbURI path = XmldbURI.ROOT_COLLECTION_URI; private Optional lazyTraceWriter = Optional.empty(); - public InteractiveClient(CommandlineOptions options) { + private @Nullable MediaTypeResolver mediaTypeResolver = null; + + public InteractiveClient(final CommandlineOptions options) { this.options = options; } - private MediaTypeResolver mediaTypeResolver = null; - /** * Display help on commands */ - protected void displayHelp() { + void displayHelp() { messageln("--- general commands ---"); messageln("ls list collection contents"); messageln("cd [collection|..] change current collection"); @@ -322,7 +316,7 @@ Thread newClientThread(final String threadName, final Runnable runnable) { * * @throws Exception Description of the Exception */ - protected void connect() throws Exception { + void connect() throws Exception { consoleOut("Connecting to database..."); final String uri = properties.getProperty(InteractiveClient.URI); @@ -349,7 +343,8 @@ protected void connect() throws Exception { DatabaseManager.registerDatabase(database); final String collectionUri = uri + path; - current = DatabaseManager.getCollection(collectionUri, properties.getProperty(USER), properties.getProperty(PASSWORD)); + final Collection collection = DatabaseManager.getCollection(collectionUri, properties.getProperty(USER), properties.getProperty(PASSWORD)); + setCollection(collection); if (options.startGUI && frame != null) { frame.setStatus("connected to " + uri + " as user " + properties.getProperty(USER)); } @@ -366,24 +361,58 @@ protected void connect() throws Exception { * * @return the current collection */ - protected Collection getCollection() { + @Nullable Collection getCollection() { return current; } + void setCollection(final Collection collection) { + if (this.current != null) { + try { + this.current.close(); + } catch (final XMLDBException e) { + // no-op + } + } + this.current = collection; + } + + XmldbURI getPath() { + return path; + } + + @Nullable LineReader getConsole() { + return console; + } + + void setConsole(@Nullable final LineReader console) { + this.console = console; + } + + List getQueryHistory() { + return queryHistory; + } + + Path getQueryHistoryFile() { + return queryHistoryFile; + } + + void setQueryHistoryFile(final Path queryHistoryFile) { + this.queryHistoryFile = queryHistoryFile; + } + public Properties getProperties() { return properties; } public void reloadCollection() throws XMLDBException { - current = DatabaseManager.getCollection(properties.getProperty(URI) - + path, properties.getProperty(USER), - properties.getProperty(PASSWORD)); + final Collection collection = getCollection(path); + setCollection(collection); getResources(); } - protected void setProperties() throws XMLDBException { + private void setProperties() throws XMLDBException { for (Map.Entry properry : properties.entrySet()) { - current.setProperty((String) properry.getKey(), (String) properry.getValue()); + getCollection().setProperty((String) properry.getKey(), (String) properry.getValue()); } } @@ -400,14 +429,15 @@ private String getGroupName(final Permission perm) { * * @throws XMLDBException Description of the Exception */ - protected void getResources() throws XMLDBException { - if (current == null) { + void getResources() throws XMLDBException { + if (getCollection() == null) { return; } + setProperties(); - final UserManagementService mgtService = current.getService(UserManagementService.class); - final List childCollections = current.listChildCollections(); - final List childResources = current.listResources(); + final UserManagementService mgtService = getCollection().getService(UserManagementService.class); + final List childCollections = getCollection().listChildCollections(); + final List childResources = getCollection().listResources(); resources = new String[childCollections.size() + childResources.size()]; //Collection child; @@ -417,9 +447,9 @@ protected void getResources() throws XMLDBException { int i = 0; for (String collectionName : childCollections) { - perm = mgtService.getSubCollectionPermissions(current, collectionName); + perm = mgtService.getSubCollectionPermissions(getCollection(), collectionName); - final Instant created = mgtService.getSubCollectionCreationTime(current, collectionName); + final Instant created = mgtService.getSubCollectionCreationTime(getCollection(), collectionName); if ("true".equals(properties.getProperty(PERMISSIONS))) { resources[i] = 'c' + perm.toString() + '\t' + getOwnerName(perm) @@ -447,7 +477,7 @@ protected void getResources() throws XMLDBException { i++; } for (String resourceId : childResources) { - try (final Resource res = current.getResource(resourceId)) { + try (final Resource res = getCollection().getResource(resourceId)) { perm = mgtService.getPermissions(res); if (perm == null) { errorln("no permissions found for resource " + resourceId); @@ -491,7 +521,7 @@ protected void getResources() throws XMLDBException { * * @param str string containing the document. */ - protected void more(final String str) { + private void more(final String str) { final LineNumberReader reader = new LineNumberReader(new StringReader(str)); String line; // int count = 0; @@ -523,7 +553,7 @@ protected void more(final String str) { * @param line the line entered * @return true if command != quit */ - protected boolean process(final String line) { + boolean process(final String line) { if (options.startGUI) { frame.setPath(path); } @@ -605,8 +635,7 @@ protected boolean process(final String line) { properties.getProperty(USER), properties.getProperty(PASSWORD)); if (temp != null) { - current.close(); - current = temp; + setCollection(temp); newPath = collectionPath.toCollectionPathURI(); if (options.startGUI) { frame.setPath(collectionPath.toCollectionPathURI()); @@ -657,25 +686,26 @@ protected boolean process(final String line) { errorln("could not parse resource name into a valid URI: " + e.getMessage()); return false; } - final Resource res = retrieve(resource); - // display document - if (res != null) { - final String data; - if (XML_RESOURCE.equals(res.getResourceType())) { - data = (String) res.getContent(); - } else { - data = new String((byte[]) res.getContent()); - } - if (options.startGUI) { - frame.setEditable(false); - frame.display(data); - frame.setEditable(true); - } else { - final String content = data; - more(content); + try (final Resource res = retrieve(resource)) { + // display document + if (res != null) { + final String data; + if (XML_RESOURCE.equals(res.getResourceType())) { + data = (String) res.getContent(); + } else { + data = new String((byte[]) res.getContent()); + } + if (options.startGUI) { + frame.setEditable(false); + frame.display(data); + frame.setEditable(true); + } else { + final String content = data; + more(content); + } } + return true; } - return true; } else if (args[0].equalsIgnoreCase("find")) { // search if (args.length < 2) { @@ -749,11 +779,12 @@ protected boolean process(final String line) { nextInSet = start + count + 1; for (int i = start; i < start + count; i++) { - final Resource r = result.getResource(i); - if (options.startGUI) { - frame.display((String) r.getContent()); - } else { - more((String) r.getContent()); + try (final Resource r = result.getResource(i)) { + if (options.startGUI) { + frame.display((String) r.getContent()); + } else { + more((String) r.getContent()); + } } } messageln("displayed items " + (start + 1) + " to " @@ -776,20 +807,17 @@ protected boolean process(final String line) { errorln("could not parse collection name into a valid URI: " + e.getMessage()); return false; } - final EXistCollectionManagementService mgtService = current.getService(EXistCollectionManagementService.class); - final Collection newCollection = mgtService.createCollection(collUri); - if (newCollection == null) { - messageln("could not create collection."); - } else { - messageln("created collection."); + final EXistCollectionManagementService mgtService = getCollection().getService(EXistCollectionManagementService.class); + try (final Collection newCollection = mgtService.createCollection(collUri)) { + if (newCollection == null) { + messageln("could not create collection."); + } else { + messageln("created collection."); + } } // re-read current collection - current = DatabaseManager.getCollection(properties - .getProperty(URI) - + path, properties.getProperty(USER), properties - .getProperty(PASSWORD)); - getResources(); + reloadCollection(); } else if (args[0].equalsIgnoreCase("put")) { // put a document or directory into the database @@ -840,11 +868,7 @@ protected boolean process(final String line) { remove(args[1]); // re-read current collection - current = DatabaseManager.getCollection(properties - .getProperty("uri") - + path, properties.getProperty(USER), properties - .getProperty(PASSWORD)); - getResources(); + reloadCollection(); } else if (args[0].equalsIgnoreCase("rmcol")) { // remove collection @@ -861,11 +885,7 @@ protected boolean process(final String line) { } rmcol(collUri); // re-read current collection - current = DatabaseManager.getCollection(properties - .getProperty(URI) - + path, properties.getProperty(USER), properties - .getProperty(PASSWORD)); - getResources(); + reloadCollection(); } else if (args[0].equalsIgnoreCase("adduser")) { if (args.length < 2) { consoleErr("Usage: adduser name"); @@ -876,7 +896,7 @@ protected boolean process(final String line) { return true; } try { - final UserManagementService mgtService = current.getService(UserManagementService.class); + final UserManagementService mgtService = getCollection().getService(UserManagementService.class); String p1; String p2; @@ -912,7 +932,7 @@ protected boolean process(final String line) { e.printStackTrace(); } } else if (args[0].equalsIgnoreCase("users")) { - final UserManagementService mgtService = current.getService(UserManagementService.class); + final UserManagementService mgtService = getCollection().getService(UserManagementService.class); final Account users[] = mgtService.getAccounts(); messageln("User\t\tGroups"); messageln("-----------------------------------------"); @@ -938,7 +958,7 @@ protected boolean process(final String line) { return true; } try { - final UserManagementService mgtService = current.getService(UserManagementService.class); + final UserManagementService mgtService = getCollection().getService(UserManagementService.class); final Account user = mgtService.getAccount(args[1]); if (user == null) { messageln("no such user."); @@ -970,30 +990,27 @@ protected boolean process(final String line) { final Collection temp; if (args.length == 3) { consoleOut("trying collection: " + args[1]); - temp = current.getChildCollection(args[1]); + temp = getCollection().getChildCollection(args[1]); if (temp == null) { consoleOut(EOL + "trying resource: " + args[1]); - final Resource r = current.getResource(args[1]); - if (r != null) { - final UserManagementService mgtService = current.getService(UserManagementService.class); - mgtService.chmod(r, args[2]); - } else { - consoleErr("Resource " + args[1] + " not found."); + try (final Resource r = getCollection().getResource(args[1])) { + if (r != null) { + final UserManagementService mgtService = getCollection().getService(UserManagementService.class); + mgtService.chmod(r, args[2]); + } else { + consoleErr("Resource " + args[1] + " not found."); + } } } else { final UserManagementService mgtService = temp.getService(UserManagementService.class); mgtService.chmod(args[2]); } } else { - final UserManagementService mgtService = current.getService(UserManagementService.class); + final UserManagementService mgtService = getCollection().getService(UserManagementService.class); mgtService.chmod(args[1]); } // re-read current collection - current = DatabaseManager.getCollection(properties - .getProperty(URI) - + path, properties.getProperty(USER), properties - .getProperty(PASSWORD)); - getResources(); + reloadCollection(); } else if (args[0].equalsIgnoreCase("chown")) { if (args.length < 3) { consoleOut("Usage: chown username group [resource]"); @@ -1002,9 +1019,9 @@ protected boolean process(final String line) { final Collection temp; if (args.length == 4) { - temp = current.getChildCollection(args[3]); + temp = getCollection().getChildCollection(args[3]); } else { - temp = current; + temp = getCollection(); } if (temp != null) { final UserManagementService mgtService = temp.getService(UserManagementService.class); @@ -1018,17 +1035,18 @@ protected boolean process(final String line) { getResources(); return true; } - final Resource res = current.getResource(args[3]); - if (res != null) { - final UserManagementService mgtService = current.getService(UserManagementService.class); - final Account u = mgtService.getAccount(args[1]); - if (u == null) { - consoleOut("unknown user"); + try (final Resource res = getCollection().getResource(args[3])) { + if (res != null) { + final UserManagementService mgtService = getCollection().getService(UserManagementService.class); + final Account u = mgtService.getAccount(args[1]); + if (u == null) { + consoleOut("unknown user"); + return true; + } + mgtService.chown(res, u, args[2]); + getResources(); return true; } - mgtService.chown(res, u, args[2]); - getResources(); - return true; } consoleErr("Resource " + args[3] + " not found."); @@ -1037,23 +1055,24 @@ protected boolean process(final String line) { messageln("Usage: lock resource"); return true; } - final Resource res = current.getResource(args[1]); - if (res != null) { - final UserManagementService mgtService = current.getService(UserManagementService.class); - final Account user = mgtService.getAccount(properties.getProperty(USER, "guest")); - if (args[0].equalsIgnoreCase("lock")) { - mgtService.lockResource(res, user); - } else { - mgtService.unlockResource(res); + try (final Resource res = getCollection().getResource(args[1])) { + if (res != null) { + final UserManagementService mgtService = getCollection().getService(UserManagementService.class); + final Account user = mgtService.getAccount(properties.getProperty(USER, "guest")); + if (args[0].equalsIgnoreCase("lock")) { + mgtService.lockResource(res, user); + } else { + mgtService.unlockResource(res); + } } } } else if (args[0].equalsIgnoreCase("elements")) { consoleOut("Element occurrences in collection " - + current.getName()); + + getCollection().getName()); consoleOut("--------------------------------------------" + "-----------"); - final IndexQueryService service = current.getService(IndexQueryService.class); + final IndexQueryService service = getCollection().getService(IndexQueryService.class); final Occurrences[] elements = service.getIndexedElements(true); for (Occurrences element : elements) { consoleOut(formatString(element.getTerm().toString(), @@ -1082,7 +1101,7 @@ protected boolean process(final String line) { final String xupdate = "" + command.toString() + ""; - final XUpdateQueryService service = current.getService(XUpdateQueryService.class); + final XUpdateQueryService service = getCollection().getService(XUpdateQueryService.class); final long mods = service.update(xupdate); consoleOut(mods + " modifications processed."); @@ -1114,14 +1133,14 @@ protected boolean process(final String line) { final String key = tok.nextToken(); final String val = tok.nextToken(); properties.setProperty(key, val); - current.setProperty(key, val); + getCollection().setProperty(key, val); getResources(); } catch (final Exception e) { consoleErr("Exception: " + e.getMessage()); } } } else if (args[0].equalsIgnoreCase("shutdown")) { - final DatabaseInstanceManager mgr = current.getService(DatabaseInstanceManager.class); + final DatabaseInstanceManager mgr = getCollection().getService(DatabaseInstanceManager.class); if (mgr == null) { messageln("Service is not available"); return true; @@ -1153,8 +1172,7 @@ protected boolean process(final String line) { * @param name */ private void editResource(final XmldbURI name) { - try { - final Resource doc = retrieve(name, properties.getProperty(OutputKeys.INDENT, "yes")); //$NON-NLS-1$ + try (final Resource doc = retrieve(name, properties.getProperty(OutputKeys.INDENT, "yes"))) { final DocumentView view = new DocumentView(this, name, doc, properties); view.setSize(new Dimension(640, 400)); view.viewDocument(); @@ -1188,7 +1206,7 @@ private Optional getTraceWriter() { } } - private ResourceSet find(String xpath) throws XMLDBException { + private EXistResourceSet find(String xpath) throws XMLDBException { if (xpath.substring(xpath.length() - EOL.length()).equals(EOL)) { xpath = xpath.substring(0, xpath.length() - EOL.length()); } @@ -1217,7 +1235,7 @@ private ResourceSet find(String xpath) throws XMLDBException { consoleOut("Sort-by = " + sortBy); } - final EXistXPathQueryService service = current.getService(EXistXPathQueryService.class); + final EXistXPathQueryService service = getCollection().getService(EXistXPathQueryService.class); service.setProperty(OutputKeys.INDENT, properties.getProperty(INDENT)); service.setProperty(OutputKeys.ENCODING, properties.getProperty(ENCODING)); @@ -1225,15 +1243,15 @@ private ResourceSet find(String xpath) throws XMLDBException { service.setNamespace(mapping.getKey(), mapping.getValue()); } - return (sortBy == null) ? service.query(xpath) : service.query(xpath, sortBy); + return sortBy == null ? (EXistResourceSet) service.query(xpath) : service.query(xpath, sortBy); } - protected final Resource retrieve(final XmldbURI resource) throws XMLDBException { + private final Resource retrieve(final XmldbURI resource) throws XMLDBException { return retrieve(resource, properties.getProperty(INDENT)); } - protected final Resource retrieve(final XmldbURI resource, final String indent) throws XMLDBException { - final Resource res = current.getResource(resource.toString()); + final Resource retrieve(final XmldbURI resource, final String indent) throws XMLDBException { + final Resource res = getCollection().getResource(resource.toString()); if (res == null) { messageln("document not found."); return null; @@ -1242,24 +1260,32 @@ protected final Resource retrieve(final XmldbURI resource, final String indent) } private void remove(final String pattern) throws XMLDBException { - final Collection collection = current; + final Collection collection = getCollection(); if (pattern.startsWith("/")) { consoleErr("path pattern should be relative to current collection"); return; } - final Resource[] resources; - final Resource res = collection.getResource(pattern); - if (res == null) { - resources = CollectionScanner.scan(collection, "", pattern); - } else { - resources = new Resource[1]; - resources[0] = res; - } - for (Resource resource : resources) { - message("removing document " + resource.getId() + " ..."); - final Collection parent = resource.getParentCollection(); - parent.removeResource(resource); - messageln(DONE); + Resource[] resources = null; + try (final Resource res = collection.getResource(pattern)) { + if (res == null) { + resources = CollectionScanner.scan(collection, "", pattern); + } else { + resources = new Resource[1]; + resources[0] = res; + } + for (final Resource resource : resources) { + message("removing document " + resource.getId() + " ..."); + try (final Collection parent = resource.getParentCollection()) { + parent.removeResource(resource); + messageln(DONE); + } + } + } finally { + if (resources != null) { + for (final Resource resource : resources) { + resource.close(); + } + } } } @@ -1269,7 +1295,7 @@ private void xupdate(final Optional resource, final Path file) throws XM return; } final String commands = XMLUtil.readFile(file, UTF_8); - final XUpdateQueryService service = current.getService(XUpdateQueryService.class); + final XUpdateQueryService service = getCollection().getService(XUpdateQueryService.class); final long modifications; if (resource.isPresent()) { modifications = service.updateResource(resource.get(), commands); @@ -1281,7 +1307,7 @@ private void xupdate(final Optional resource, final Path file) throws XM } private void rmcol(final XmldbURI collection) throws XMLDBException { - final EXistCollectionManagementService mgtService = current.getService(EXistCollectionManagementService.class); + final EXistCollectionManagementService mgtService = getCollection().getService(EXistCollectionManagementService.class); message("removing collection " + collection + " ..."); mgtService.removeCollection(collection); messageln(DONE); @@ -1289,24 +1315,25 @@ private void rmcol(final XmldbURI collection) throws XMLDBException { private void copy(final XmldbURI source, XmldbURI destination) throws XMLDBException { try { - final EXistCollectionManagementService mgtService = current.getService(EXistCollectionManagementService.class); + final EXistCollectionManagementService mgtService = getCollection().getService(EXistCollectionManagementService.class); final XmldbURI destName = destination.lastSegment(); - final Collection destCol = resolveCollection(destination); + final Collection destCol = getCollection(destination); if (destCol == null) { if (destination.numSegments() == 1) { - destination = XmldbURI.xmldbUriFor(current.getName()); + destination = XmldbURI.xmldbUriFor(getCollection().getName()); } else { destination = destination.removeLastSegment(); } } - final Resource srcDoc = resolveResource(source); - if (srcDoc != null) { - final XmldbURI resourcePath = XmldbURI.xmldbUriFor(srcDoc.getParentCollection().getName()).append(srcDoc.getId()); - messageln("Copying resource '" + resourcePath + "' to '" + destination + "'"); - mgtService.copyResource(resourcePath, destination, destName); - } else { - messageln("Copying collection '" + source + "' to '" + destination + "'"); - mgtService.copy(source, destination, destName); + try (final Resource srcDoc = getResource(source)) { + if (srcDoc != null) { + final XmldbURI resourcePath = XmldbURI.xmldbUriFor(srcDoc.getParentCollection().getName()).append(srcDoc.getId()); + messageln("Copying resource '" + resourcePath + "' to '" + destination + "'"); + mgtService.copyResource(resourcePath, destination, destName); + } else { + messageln("Copying collection '" + source + "' to '" + destination + "'"); + mgtService.copy(source, destination, destName); + } } } catch (final URISyntaxException e) { errorln("could not parse name into a valid URI: " + e.getMessage()); @@ -1314,8 +1341,8 @@ private void copy(final XmldbURI source, XmldbURI destination) throws XMLDBExcep } private void reindex() throws XMLDBException { - final IndexQueryService service = current.getService(IndexQueryService.class); - message("reindexing collection " + current.getName()); + final IndexQueryService service = getCollection().getService(IndexQueryService.class); + message("reindexing collection " + getCollection().getName()); service.reindexCollection(); messageln(DONE); } @@ -1324,10 +1351,10 @@ private void storeBinary(final String fileName) throws XMLDBException { final Path file = Paths.get(fileName).normalize(); if (Files.isReadable(file)) { @Nullable final MediaType mediaType = mediaTypeResolver.fromFileName(FileUtils.fileName(file)); - try (final BinaryResource resource = current.createResource(FileUtils.fileName(file), BinaryResource.class)) { + try (final BinaryResource resource = getCollection().createResource(FileUtils.fileName(file), BinaryResource.class)) { resource.setContent(file); ((EXistResource) resource).setMediaType(mediaType == null ? mediaTypeResolver.forUnknown().getIdentifier() : mediaType.getIdentifier()); - current.storeResource(resource); + getCollection().storeResource(resource); } } } @@ -1337,49 +1364,35 @@ MediaTypeResolver getMediaTypeResolver() { } private synchronized boolean findRecursive(final Collection collection, final Path dir, final XmldbURI base) throws XMLDBException { - Collection c; - EXistCollectionManagementService mgtService; - //The XmldbURIs here aren't really used... - XmldbURI next; - @Nullable MediaType mediaType = null; - try { final List files = FileUtils.list(dir); int i = 0; for (final Path file : files) { - next = base.append(FileUtils.fileName(file)); - try { - if (Files.isDirectory(file)) { - messageln("entering directory " + file.toAbsolutePath()); - c = collection.getChildCollection(FileUtils.fileName(file)); - if (c == null) { - mgtService = collection.getService(EXistCollectionManagementService.class); - c = mgtService.createCollection(XmldbURI.xmldbUriFor(FileUtils.fileName(file))); - } - - if (c instanceof Observable && options.verbose) { + final XmldbURI next = base.append(FileUtils.fileName(file)); + if (Files.isDirectory(file)) { + messageln("entering directory " + file.toAbsolutePath()); + try (final Collection child = getOrCreateChildCollection(collection, FileUtils.fileName(file))) { + if (child instanceof Observable && options.verbose) { final ProgressObserver observer = new ProgressObserver(); - ((Observable) c).addObserver(observer); - } - findRecursive(c, file, next); - } else { - final long start1 = System.currentTimeMillis(); - mediaType = mediaTypeResolver.fromFileName(FileUtils.fileName(file)); - if (mediaType == null) { - messageln("File " + FileUtils.fileName(file) + " has an unknown suffix. Cannot determine file type."); - mediaType = mediaTypeResolver.forUnknown(); - } - try (final Resource document = collection.createResource(FileUtils.fileName(file), toResourceTypeClass(mediaType))) { - message("storing document " + FileUtils.fileName(file) + " (" + i + " of " + files.size() + ") " + "..."); - document.setContent(file); - ((EXistResource) document).setMediaType(mediaType.getIdentifier()); - collection.storeResource(document); - ++filesCount; - messageln(" " + FileUtils.sizeQuietly(file) + " bytes in " + (System.currentTimeMillis() - start1) + "ms."); + ((Observable) child).addObserver(observer); } + findRecursive(child, file, next); + } + } else { + final long start1 = System.currentTimeMillis(); + @Nullable MediaType mediaType = mediaTypeResolver.fromFileName(FileUtils.fileName(file)); + if (mediaType == null) { + messageln("File " + FileUtils.fileName(file) + " has an unknown suffix. Cannot determine file type."); + mediaType = mediaTypeResolver.forUnknown(); + } + try (final Resource document = collection.createResource(FileUtils.fileName(file), toResourceTypeClass(mediaType))) { + message("storing document " + FileUtils.fileName(file) + " (" + i + " of " + files.size() + ") " + "..."); + document.setContent(file); + ((EXistResource) document).setMediaType(mediaType.getIdentifier()); + collection.storeResource(document); + ++filesCount; + messageln(" " + FileUtils.sizeQuietly(file) + " bytes in " + (System.currentTimeMillis() - start1) + "ms."); } - } catch (final URISyntaxException e) { - errorln("uri syntax exception parsing " + file.toAbsolutePath() + ": " + e.getMessage()); } i++; } @@ -1389,6 +1402,16 @@ private synchronized boolean findRecursive(final Collection collection, final Pa } } + private static Collection getOrCreateChildCollection(final Collection parentCollection, final String collectionName) throws XMLDBException { + @Nullable final Collection existingChild = parentCollection.getChildCollection(collectionName); + if (existingChild != null) { + return existingChild; + } + + final EXistCollectionManagementService mgtService = parentCollection.getService(EXistCollectionManagementService.class); + return mgtService.createCollection(collectionName); + } + private static Class toResourceTypeClass(final MediaType mediaType) { return mediaType.getStorageType() == StorageType.XML ? XMLResource.class : BinaryResource.class; } @@ -1400,13 +1423,13 @@ private static Class toResourceTypeClass(final MediaType med * @return TRUE if file or files in directory were all correctly stored. * @throws XMLDBException An error was detected. */ - protected synchronized boolean parse(final Path file) throws XMLDBException { + private synchronized boolean parse(final Path file) throws XMLDBException { try { // String xml; - if (current instanceof Observable && options.verbose) { + if (getCollection() instanceof Observable && options.verbose) { final ProgressObserver observer = new ProgressObserver(); - ((Observable) current).addObserver(observer); + ((Observable) getCollection()).addObserver(observer); } List files = new ArrayList<>(); @@ -1416,7 +1439,7 @@ protected synchronized boolean parse(final Path file) throws XMLDBException { if (options.reindexRecurse) { filesCount = 0; final long start = System.currentTimeMillis(); - final boolean result = findRecursive(current, file, path); + final boolean result = findRecursive(getCollection(), file, path); messageln("storing " + filesCount + " files took " + ((System.currentTimeMillis() - start) / 1000) + "sec."); return result; } @@ -1448,11 +1471,11 @@ protected synchronized boolean parse(final Path file) throws XMLDBException { if (mediaType == null) { mediaType = mediaTypeResolver.forUnknown(); } - try (final Resource document = current.createResource(FileUtils.fileName(files.get(i)), toResourceTypeClass(mediaType))) { + try (final Resource document = getCollection().createResource(FileUtils.fileName(files.get(i)), toResourceTypeClass(mediaType))) { message("storing document " + FileUtils.fileName(files.get(i)) + " (" + (i + 1) + " of " + files.size() + ") ..."); document.setContent(files.get(i)); ((EXistResource) document).setMediaType(mediaType.getIdentifier()); - current.storeResource(document); + getCollection().storeResource(document); messageln(DONE); messageln("parsing " + FileUtils.sizeQuietly(files.get(i)) + " bytes took " + (System.currentTimeMillis() - start) + "ms." + EOL); bytes += FileUtils.sizeQuietly(files.get(i)); @@ -1469,59 +1492,47 @@ protected synchronized boolean parse(final Path file) throws XMLDBException { private synchronized boolean findGZipRecursive(final Collection collection, final Path dir, final XmldbURI base) throws XMLDBException, IOException { final List files = FileUtils.list(dir); - Collection c; - EXistCollectionManagementService mgtService; - //The XmldbURIs here aren't really used... - XmldbURI next; - @Nullable MediaType mediaType = null; int i = 0; for (final Path file : files) { i++; - next = base.append(FileUtils.fileName(file)); - try { - if (Files.isDirectory(file)) { - messageln("entering directory " + file.toAbsolutePath().toString()); - c = collection.getChildCollection(FileUtils.fileName(file)); - if (c == null) { - mgtService = collection.getService(EXistCollectionManagementService.class); - c = mgtService.createCollection(XmldbURI.xmldbUriFor(FileUtils.fileName(file))); - } - if (c instanceof Observable && options.verbose) { + final XmldbURI next = base.append(FileUtils.fileName(file)); + if (Files.isDirectory(file)) { + messageln("entering directory " + file.toAbsolutePath().toString()); + try (final Collection child = getOrCreateChildCollection(collection, FileUtils.fileName(file))) { + if (child instanceof Observable && options.verbose) { final ProgressObserver observer = new ProgressObserver(); - ((Observable) c).addObserver(observer); - } - findGZipRecursive(c, file, next); - } else { - final long start1 = System.currentTimeMillis(); - final String compressedName = FileUtils.fileName(file); - String localName = compressedName; - final String[] cSuffix = {".gz", ".Z"}; - boolean isCompressed = false; - for (final String suf : cSuffix) { - if (localName.endsWith(suf)) { - // Removing compressed prefix to validate - localName = compressedName.substring(0, localName.length() - suf.length()); - isCompressed = true; - break; - } - } - mediaType = mediaTypeResolver.fromFileName(localName); - if (mediaType == null) { - messageln("File " + compressedName + " has an unknown suffix. Cannot determine file type."); - mediaType = mediaTypeResolver.forUnknown(); + ((Observable) child).addObserver(observer); } - try (final Resource document = collection.createResource(compressedName, toResourceTypeClass(mediaType))) { - message("storing document " + compressedName + " (" + i + " of " + files.size() + ") " + "..."); - document.setContent(isCompressed ? new GZIPInputSource(file) : file); - ((EXistResource) document).setMediaType(mediaType.getIdentifier()); - collection.storeResource(document); - ++filesCount; - messageln(" " + Files.size(file) + (isCompressed ? " compressed" : "") + " bytes in " - + (System.currentTimeMillis() - start1) + "ms."); + findGZipRecursive(child, file, next); + } + } else { + final long start1 = System.currentTimeMillis(); + final String compressedName = FileUtils.fileName(file); + String localName = compressedName; + final String[] cSuffix = {".gz", ".Z"}; + boolean isCompressed = false; + for (final String suf : cSuffix) { + if (localName.endsWith(suf)) { + // Removing compressed prefix to validate + localName = compressedName.substring(0, localName.length() - suf.length()); + isCompressed = true; + break; } } - } catch (final URISyntaxException e) { - errorln("uri syntax exception parsing " + file.toAbsolutePath().toString() + ": " + e.getMessage()); + @Nullable MediaType mediaType = mediaTypeResolver.fromFileName(localName); + if (mediaType == null) { + messageln("File " + compressedName + " has an unknown suffix. Cannot determine file type."); + mediaType = mediaTypeResolver.forUnknown(); + } + try (final Resource document = collection.createResource(compressedName, toResourceTypeClass(mediaType))) { + message("storing document " + compressedName + " (" + i + " of " + files.size() + ") " + "..."); + document.setContent(isCompressed ? new GZIPInputSource(file) : file); + ((EXistResource) document).setMediaType(mediaType.getIdentifier()); + collection.storeResource(document); + ++filesCount; + messageln(" " + Files.size(file) + (isCompressed ? " compressed" : "") + " bytes in " + + (System.currentTimeMillis() - start1) + "ms."); + } } } return true; @@ -1535,15 +1546,15 @@ private synchronized boolean findGZipRecursive(final Collection collection, fina * @throws XMLDBException in case of database error storing the resource * @throws IOException in case of a read error */ - protected synchronized boolean parseGZip(String fileName) throws XMLDBException, IOException { + private synchronized boolean parseGZip(String fileName) throws XMLDBException, IOException { //TODO : why is this test for ? Fileshould make it, shouldn't it ? -pb fileName = fileName.replace('/', java.io.File.separatorChar).replace('\\', java.io.File.separatorChar); final Path file = Paths.get(fileName); // String xml; - if (current instanceof Observable && options.verbose) { + if (getCollection() instanceof Observable && options.verbose) { final ProgressObserver observer = new ProgressObserver(); - ((Observable) current).addObserver(observer); + ((Observable) getCollection()).addObserver(observer); } final List files; if (Files.isReadable(file)) { @@ -1552,7 +1563,7 @@ protected synchronized boolean parseGZip(String fileName) throws XMLDBException, if (options.reindexRecurse) { filesCount = 0; final long start = System.currentTimeMillis(); - final boolean result = findGZipRecursive(current, file, path); + final boolean result = findGZipRecursive(getCollection(), file, path); messageln("storing " + filesCount + " compressed files took " + ((System.currentTimeMillis() - start) / 1000) + "sec."); @@ -1604,12 +1615,12 @@ protected synchronized boolean parseGZip(String fileName) throws XMLDBException, if (mediaType == null) { mediaType = mediaTypeResolver.forUnknown(); } - try (final Resource document = current.createResource(compressedName, toResourceTypeClass(mediaType))) { + try (final Resource document = getCollection().createResource(compressedName, toResourceTypeClass(mediaType))) { message("storing document " + compressedName + " (" + i + " of " + Files.size(p) + ") ..."); document.setContent(isCompressed ? new GZIPInputSource(p) : p); ((EXistResource) document).setMediaType(mediaType.getIdentifier()); - current.storeResource(document); + getCollection().storeResource(document); messageln(DONE); messageln("parsing " + Files.size(p) + (isCompressed ? " compressed" : "") + " bytes took " + (System.currentTimeMillis() - start) + "ms." + EOL); @@ -1628,11 +1639,11 @@ protected synchronized boolean parseGZip(String fileName) throws XMLDBException, * @return true if operation succeeded * @throws XMLDBException in case of error writing to the database */ - protected synchronized boolean parseZip(final Path zipPath) throws XMLDBException { + private synchronized boolean parseZip(final Path zipPath) throws XMLDBException { try (final ZipFile zfile = new ZipFile(zipPath.toFile())) { - if (current instanceof Observable && options.verbose) { + if (getCollection() instanceof Observable && options.verbose) { final ProgressObserver observer = new ProgressObserver(); - ((Observable) current).addObserver(observer); + ((Observable) getCollection()).addObserver(observer); } final long start0 = System.currentTimeMillis(); @@ -1640,7 +1651,7 @@ protected synchronized boolean parseZip(final Path zipPath) throws XMLDBExceptio final Enumeration e = zfile.entries(); int number = 0; - Collection base = current; + Collection base = getCollection(); String baseStr = ""; while (e.hasMoreElements()) { number++; @@ -1659,18 +1670,27 @@ protected synchronized boolean parseZip(final Path zipPath) throws XMLDBExceptio .append(pathSteps[i]); } if (!currStr.toString().equals(baseStr)) { - base = current; - for (int i = 0; i < pathSteps.length - 1; i++) { - Collection c = base.getChildCollection(pathSteps[i]); - if (c == null) { - final EXistCollectionManagementService mgtService = base.getService(EXistCollectionManagementService.class); - c = mgtService.createCollection(XmldbURI.xmldbUriFor(pathSteps[i])); + base = getCollection(); + final List createdChildren = new ArrayList<>(pathSteps.length - 1); + try { + for (int i = 0; i < pathSteps.length - 1; i++) { + final Collection child = getOrCreateChildCollection(base, pathSteps[i]); + createdChildren.add(child); + base = child; + } + + if (base instanceof Observable && options.verbose) { + final ProgressObserver observer = new ProgressObserver(); + ((Observable) base).addObserver(observer); + } + } finally { + for (final Collection createdChild : createdChildren) { + try { + createdChild.close(); + } catch (final XMLDBException ee) { + // no-op + } } - base = c; - } - if (base instanceof Observable && options.verbose) { - final ProgressObserver observer = new ProgressObserver(); - ((Observable) base).addObserver(observer); } baseStr = currStr.toString(); messageln("entering directory " + baseStr); @@ -1697,8 +1717,6 @@ protected synchronized boolean parseZip(final Path zipPath) throws XMLDBExceptio } messageln("parsed " + bytes + " bytes in " + (System.currentTimeMillis() - start0) + "ms."); - } catch (final URISyntaxException e) { - errorln("uri syntax exception parsing a ZIP entry from " + zipPath.toString() + ": " + e.getMessage()); } catch (final IOException e) { errorln("could not parse ZIP file " + zipPath.toAbsolutePath() + ": " + e.getMessage()); } @@ -1713,8 +1731,8 @@ protected synchronized boolean parseZip(final Path zipPath) throws XMLDBExceptio * @return true if the operation succeeded * @throws XMLDBException in case of an error uploading the resources */ - protected synchronized boolean parse(final List files, final UploadDialog upload) throws XMLDBException { - final Collection uploadRootCollection = current; + synchronized boolean parse(final List files, final UploadDialog upload) throws XMLDBException { + final Collection uploadRootCollection = getCollection(); if (!upload.isVisible()) { upload.setVisible(true); } @@ -1767,32 +1785,26 @@ private void store(final Collection collection, final Path file, final UploadDia // Directory, create collection, and crawl it if (Files.isDirectory(file)) { - Collection c = null; - try { - c = collection.getChildCollection(filenameUri.toString()); - if (c == null) { - final EXistCollectionManagementService mgtService = collection.getService(EXistCollectionManagementService.class); - c = mgtService.createCollection(filenameUri); + try (final Collection child = getOrCreateChildCollection(collection, filenameUri.toString())) { + + // change displayed collection if it's OK + upload.setCurrentDir(file.toAbsolutePath().toString()); + if (child instanceof Observable) { + ((Observable) child).addObserver(upload.getObserver()); + } + // maybe a depth or recurs flag could be added here + try (final Stream children = Files.list(file)) { + children.forEach(childPath -> store(child, childPath, upload)); + } catch (final IOException e) { + upload.showMessage("Impossible to upload " + file.toAbsolutePath() + ": " + e.getMessage()); + e.printStackTrace(); } + } catch (final XMLDBException e) { upload.showMessage("Impossible to create a collection " + file.toAbsolutePath() + ": " + e.getMessage()); e.printStackTrace(); } - // change displayed collection if it's OK - upload.setCurrentDir(file.toAbsolutePath().toString()); - if (c instanceof Observable) { - ((Observable) c).addObserver(upload.getObserver()); - } - // maybe a depth or recurs flag could be added here - final Collection childCollection = c; - try (final Stream children = Files.list(file)) { - children.forEach(child -> store(childCollection, child, upload)); - } catch (final IOException e) { - upload.showMessage("Impossible to upload " + file.toAbsolutePath() + ": " + e.getMessage()); - e.printStackTrace(); - } - return; } @@ -1826,28 +1838,53 @@ private void store(final Collection collection, final Path file, final UploadDia } } - private void mkcol(final XmldbURI collPath) throws XMLDBException { messageln("creating '" + collPath + "'"); final XmldbURI[] segments = collPath.getPathSegments(); - XmldbURI p = XmldbURI.ROOT_COLLECTION_URI; - for (int i = 1; i < segments.length; i++) { - p = p.append(segments[i]); - final Collection c = DatabaseManager.getCollection(properties.getProperty(URI) + p, properties.getProperty(USER), properties.getProperty(PASSWORD)); - if (c == null) { - final EXistCollectionManagementService mgtService = current.getService(EXistCollectionManagementService.class); - current = mgtService.createCollection(segments[i]); + @Nullable XmldbURI path = null; + @Nullable Collection collection = null; + for (int i = 0; i < segments.length; i++) { + if (i == 0) { + path = XmldbURI.ROOT_COLLECTION_URI; + collection = getCollection(path.toString()); + } else { - current = c; + path = path.append(segments[i]); + + // get or create the child collection + final String childName = segments[i].toString(); + @Nullable Collection child = collection.getChildCollection(childName); + if (child == null) { + final CollectionManagementService collectionManagementService = collection.getService(CollectionManagementService.class); + child = collectionManagementService.createCollection(childName); + } + + try { + // close the parent collection + collection.close(); + } catch (final XMLDBException e) { + // no-op + } + + collection = child; } } - path = p; + + if (collection != null) { + setCollection(collection); + } + + this.path = collPath; } - protected Collection getCollection(final String path) throws XMLDBException { + Collection getCollection(final String path) throws XMLDBException { return DatabaseManager.getCollection(properties.getProperty(URI) + path, properties.getProperty(USER), properties.getProperty(PASSWORD)); } + private Collection getCollection(final XmldbURI path) throws XMLDBException { + return getCollection(path.toString()); + } + private Properties loadClientProperties() { try { final Properties properties = ConfigurationHelper.loadProperties("client.properties", getClass()); @@ -1869,7 +1906,7 @@ private Properties loadClientProperties() { * @param options CommandLineOptions * @param props Client configuration */ - protected void setPropertiesFromCommandLine(final CommandlineOptions options, final Properties props) { + private void setPropertiesFromCommandLine(final CommandlineOptions options, final Properties props) { options.options.forEach(properties::setProperty); options.username.ifPresent(username -> props.setProperty(USER, username)); @@ -1937,8 +1974,7 @@ private boolean processCommandLineActions() throws IOException { } if (options.getDoc.isPresent()) { - try { - final Resource res = retrieve(options.getDoc.get()); + try (final Resource res = retrieve(options.getDoc.get())) { if (res != null) { // String data; if (XML_RESOURCE.equals(res.getResourceType())) { @@ -2027,8 +2063,7 @@ private boolean processCommandLineActions() throws IOException { } if (xpath != null) { - try { - final ResourceSet result = find(xpath); + try (final EXistResourceSet result = find(xpath)) { final int maxResults = options.howManyResults.filter(n -> n > 0).orElse((int) result.getSize()); if (options.outputFile.isPresent()) { @@ -2038,21 +2073,23 @@ private boolean processCommandLineActions() throws IOException { ) { for (int i = 0; i < maxResults && i < result.getSize(); i++) { - final Resource res = result.getResource(i); - if (res instanceof ExtendedResource) { - ((ExtendedResource) res).getContentIntoAStream(ps); - } else { - ps.print(res.getContent().toString()); + try (final Resource res = result.getResource(i)) { + if (res instanceof ExtendedResource) { + ((ExtendedResource) res).getContentIntoAStream(ps); + } else { + ps.print(res.getContent().toString()); + } } } } } else { for (int i = 0; i < maxResults && i < result.getSize(); i++) { - final Resource res = result.getResource(i); - if (res instanceof ExtendedResource) { - ((ExtendedResource) res).getContentIntoAStream(System.out); - } else { - consoleOut(String.valueOf(res.getContent())); + try (final Resource res = result.getResource(i)) { + if (res instanceof ExtendedResource) { + ((ExtendedResource) res).getContentIntoAStream(System.out); + } else { + consoleOut(String.valueOf(res.getContent())); + } } } } @@ -2173,7 +2210,7 @@ public boolean run() throws Exception { // connect to the db connectToDatabase(); - if (current == null) { + if (getCollection() == null) { if (options.startGUI && frame != null) { frame.setStatus("Could not retrieve collection " + path); } else { @@ -2299,7 +2336,7 @@ final boolean initializeGui() throws ClassNotFoundException, InstantiationExcept messageln(EOL + "type help or ? for help."); if (options.openQueryGUI) { - final QueryDialog qd = new QueryDialog(this, current, properties); + final QueryDialog qd = new QueryDialog(this, getCollection(), properties); qd.setLocation(100, 100); qd.setVisible(true); } else if (!options.startGUI) { @@ -2356,7 +2393,7 @@ public static String getExceptionMessage(Throwable e) { /** * Read Query History file. */ - protected void readQueryHistory() { + void readQueryHistory() { if (!Files.isReadable(queryHistoryFile)) { return; } @@ -2389,11 +2426,11 @@ protected void readQueryHistory() { } } - protected void addToHistory(final String query) { + void addToHistory(final String query) { queryHistory.add(query); } - protected void writeQueryHistory() { + void writeQueryHistory() { try { console.getHistory().save(); } catch (final IOException e) { @@ -2459,7 +2496,7 @@ public void readlineInputLoop() { messageln("quit."); } - protected final void shutdown(final boolean force) { + final void shutdown(final boolean force) { lazyTraceWriter.ifPresent(writer -> { try { writer.write(""); @@ -2469,7 +2506,7 @@ protected final void shutdown(final boolean force) { }); try { - final DatabaseInstanceManager mgr = current.getService(DatabaseInstanceManager.class); + final DatabaseInstanceManager mgr = getCollection().getService(DatabaseInstanceManager.class); if (mgr == null) { consoleErr("service is not available"); } else if (mgr.isLocalInstance() || force) { @@ -2560,22 +2597,15 @@ static final void consoleErr(final String msg) { System.err.println(msg); //NOSONAR this has to go to the console } - private Collection resolveCollection(final XmldbURI path) throws XMLDBException { - return DatabaseManager.getCollection( - properties.getProperty(URI) + path, - properties.getProperty(USER), - properties.getProperty(PASSWORD)); - } - - private Resource resolveResource(final XmldbURI path) throws XMLDBException { + private Resource getResource(final XmldbURI path) throws XMLDBException { try { final XmldbURI collectionPath = path.numSegments() == 1 ? - XmldbURI.xmldbUriFor(current.getName()) : path.removeLastSegment(); + XmldbURI.xmldbUriFor(getCollection().getName()) : path.removeLastSegment(); final XmldbURI resourceName = path.lastSegment(); - final Collection collection = resolveCollection(collectionPath); + final Collection collection = getCollection(collectionPath); if (collection == null) { messageln("Collection " + collectionPath + " not found."); diff --git a/exist-core/src/main/java/org/exist/client/NewResourceDialog.java b/exist-core/src/main/java/org/exist/client/NewResourceDialog.java index fc7dc739f2..824241b46f 100644 --- a/exist-core/src/main/java/org/exist/client/NewResourceDialog.java +++ b/exist-core/src/main/java/org/exist/client/NewResourceDialog.java @@ -314,7 +314,7 @@ private void createResource(final ResourceType resourceType, final String filena resType = BinaryResource.class; } - try (final Collection collection = client.current; final Resource resource = collection.createResource(resName, resType)) { + try (final Collection collection = client.getCollection(); final Resource resource = collection.createResource(resName, resType)) { resource.setContent(resourceContent); ((EXistResource) resource).setMediaType(resourceType.getMimeType()); collection.storeResource(resource); diff --git a/exist-core/src/main/java/org/exist/client/QueryDialog.java b/exist-core/src/main/java/org/exist/client/QueryDialog.java index 1253ac6eaf..444cf717cc 100644 --- a/exist-core/src/main/java/org/exist/client/QueryDialog.java +++ b/exist-core/src/main/java/org/exist/client/QueryDialog.java @@ -89,10 +89,7 @@ import org.apache.commons.io.output.StringBuilderWriter; import org.exist.security.PermissionDeniedException; import org.exist.util.Holder; -import org.exist.xmldb.EXistXQueryService; -import org.exist.xmldb.LocalCollection; -import org.exist.xmldb.UserManagementService; -import org.exist.xmldb.XmldbURI; +import org.exist.xmldb.*; import org.exist.xquery.CompiledXQuery; import org.exist.xquery.XQueryContext; import org.exist.xquery.XQueryWatchDog; @@ -104,7 +101,6 @@ import org.xmldb.api.base.ErrorCodes; import org.xmldb.api.base.Resource; import org.xmldb.api.base.ResourceIterator; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import xyz.elemental.mediatype.MediaType; @@ -347,7 +343,7 @@ private JComponent createQueryBox() { JLabel label = new JLabel(Messages.getString("QueryDialog.historylabel")); historyBox.add(label); final JComboBox historyList = new JComboBox<>(history); - for (final String queryHistory : client.queryHistory) { + for (final String queryHistory : client.getQueryHistory()) { addQuery(queryHistory); } historyList.setSelectedIndex(-1); // by default - we are not using anything from the history! @@ -355,7 +351,7 @@ private JComponent createQueryBox() { if (itemEvent.getStateChange() == ItemEvent.SELECTED) { final JComboBox list = (JComboBox) itemEvent.getSource(); final int idx = list.getSelectedIndex(); - query.setText(client.queryHistory.get(idx)); + query.setText(client.getQueryHistory().get(idx)); } }); historyBox.add(historyList); @@ -592,7 +588,7 @@ public void run() { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); long tResult = 0; long tCompiled = 0; - ResourceSet result = null; + EXistResourceSet result = null; XQueryContext context = null; try { final EXistXQueryService service = collection.getService(EXistXQueryService.class); @@ -618,7 +614,7 @@ public void run() { exprDisplay.setText(writer.toString()); } - result = service.execute(compiled); + result = (EXistResourceSet) service.execute(compiled); tResult = System.currentTimeMillis() - t1; runningContext.set(null); @@ -672,6 +668,14 @@ public void run() { Messages.getString("QueryDialog.queryrunerrormessage") + ": " + InteractiveClient.getExceptionMessage(e), e); } finally { + if (result != null) { + try { + result.close(); + } catch (final XMLDBException e) { + // ignore error + } + } + if (context != null) { context.runCleanupTasks(); } @@ -683,7 +687,7 @@ public void run() { // ignore error } } - if (client.queryHistory.isEmpty() || !client.queryHistory.getLast().equals(xpath)) { + if (client.getQueryHistory().isEmpty() || !client.getQueryHistory().getLast().equals(xpath)) { client.addToHistory(xpath); client.writeQueryHistory(); addQuery(xpath); @@ -711,8 +715,7 @@ public GetCollectionsListSwingWorker(final String currentCollectionName) { @Override public Void doInBackground() { - try { - final Collection root = client.getCollection(XmldbURI.ROOT_COLLECTION); + try (final Collection root = client.getCollection(XmldbURI.ROOT_COLLECTION)) { getCollections(root, currentCollectionName); } catch (final XMLDBException e) { ClientFrame.showErrorMessage( @@ -745,14 +748,14 @@ private void getCollections(final Collection root, final String currentCollectio publish(rootName); } - for (String collectionName : root.listChildCollections()) { - try (Collection child = root.getChildCollection(collectionName)) { + for (final String collectionName : root.listChildCollections()) { + try (final Collection child = root.getChildCollection(collectionName)) { getCollections(child, currentCollection); - } catch (final XMLDBException xmldbe) { - if (!(xmldbe.getCause() instanceof PermissionDeniedException)) { - throw xmldbe; + } catch (final XMLDBException e) { + if (!(e.getCause() instanceof PermissionDeniedException)) { + throw e; } - } catch (Exception npe) { + } catch (final Exception e) { System.out.println("Corrupted resource/collection skipped: " + collectionName); } } diff --git a/exist-core/src/main/java/org/exist/client/TriggersDialog.java b/exist-core/src/main/java/org/exist/client/TriggersDialog.java index f7a0241ed5..5d19b51ded 100644 --- a/exist-core/src/main/java/org/exist/client/TriggersDialog.java +++ b/exist-core/src/main/java/org/exist/client/TriggersDialog.java @@ -54,6 +54,7 @@ import java.awt.event.WindowListener; import java.util.ArrayList; import java.util.List; +import javax.annotation.Nullable; import javax.swing.Box; import javax.swing.DefaultCellEditor; import javax.swing.JButton; @@ -137,13 +138,11 @@ private void setupComponents() { //get the collections but not system collections final List alCollections = new ArrayList<>(); - try { - final Collection root = client.getCollection(XmldbURI.ROOT_COLLECTION); - final List alAllCollections = getCollections(root, new ArrayList<>()); - for (PrettyXmldbURI alAllCollection : alAllCollections) { - //TODO : use XmldbURIs ! - if (!alAllCollection.toString().contains(XmldbURI.CONFIG_COLLECTION)) { - alCollections.add(alAllCollection); + try (final Collection root = client.getCollection(XmldbURI.ROOT_COLLECTION)) { + final List collections = ClientFrame.getCollections(root, new ArrayList<>()); + for (final PrettyXmldbURI collection : collections) { + if (!collection.toString().contains(XmldbURI.CONFIG_COLLECTION)) { + alCollections.add(collection); } } } catch(final XMLDBException e) { @@ -225,7 +224,7 @@ private void saveChanges() { if(result == JOptionPane.YES_OPTION) { //save the collection.xconf changes - if(cx.Save()) { + if(cx.save()) { //save ok JOptionPane.showMessageDialog(getContentPane(), "Your changes have been saved."); } else { @@ -236,26 +235,6 @@ private void saveChanges() { } } - //THIS IS A COPY FROM ClientFrame - //TODO: share this code between the two classes - private List getCollections(final Collection root, final List collectionsList) throws XMLDBException { - collectionsList.add(new PrettyXmldbURI(XmldbURI.create(root.getName()))); - Collection child; - for (String childCollection : root.listChildCollections()) { - try { - child = root.getChildCollection(childCollection); - } catch (final XMLDBException xmldbe) { - if (xmldbe.getCause() instanceof PermissionDeniedException) { - continue; - } else { - throw xmldbe; - } - } - getCollections(child, collectionsList); - } - return collectionsList; - } - private void actionAddTrigger() { triggersModel.addRow(); } diff --git a/exist-core/src/main/java/org/exist/client/security/EditPropertiesDialog.java b/exist-core/src/main/java/org/exist/client/security/EditPropertiesDialog.java index daf85fe116..9c535881cb 100644 --- a/exist-core/src/main/java/org/exist/client/security/EditPropertiesDialog.java +++ b/exist-core/src/main/java/org/exist/client/security/EditPropertiesDialog.java @@ -508,11 +508,13 @@ private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST } if (desc.isCollection()) { - final Collection coll = parent.getChildCollection(desc.getName().toString()); - getUserManagementService().setPermissions(coll, newOwner, newGroup, updatedPermission.getMode(), dlgAces); + try (final Collection coll = parent.getChildCollection(desc.getName().toString())) { + getUserManagementService().setPermissions(coll, newOwner, newGroup, updatedPermission.getMode(), dlgAces); + } } else { - final Resource res = parent.getResource(desc.getName().toString()); - getUserManagementService().setPermissions(res, newOwner, newGroup, updatedPermission.getMode(), dlgAces); + try (final Resource res = parent.getResource(desc.getName().toString())) { + getUserManagementService().setPermissions(res, newOwner, newGroup, updatedPermission.getMode(), dlgAces); + } } } diff --git a/exist-core/src/main/java/org/exist/jetty/ServerShutdown.java b/exist-core/src/main/java/org/exist/jetty/ServerShutdown.java index 961a5f5cdf..493d575736 100644 --- a/exist-core/src/main/java/org/exist/jetty/ServerShutdown.java +++ b/exist-core/src/main/java/org/exist/jetty/ServerShutdown.java @@ -136,11 +136,12 @@ private static void process(final ParsedArguments arguments) { if (!uri.endsWith(XmldbURI.ROOT_COLLECTION)) { uri = uri + XmldbURI.ROOT_COLLECTION; } - final Collection root = DatabaseManager.getCollection(uri, user, passwd); - final DatabaseInstanceManager manager = root.getService(DatabaseInstanceManager.class); - System.out.println("Shutting down database instance at "); - System.out.println('\t' + uri); - manager.shutdown(); + try (final Collection root = DatabaseManager.getCollection(uri, user, passwd)) { + final DatabaseInstanceManager manager = root.getService(DatabaseInstanceManager.class); + System.out.println("Shutting down database instance at "); + System.out.println('\t' + uri); + manager.shutdown(); + } } catch (final XMLDBException e) { System.err.println("ERROR: " + e.getMessage()); diff --git a/exist-core/src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java b/exist-core/src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java index 6622f2e723..8a424c5e07 100644 --- a/exist-core/src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java +++ b/exist-core/src/main/java/org/exist/test/ExistXmldbEmbeddedServer.java @@ -51,11 +51,17 @@ import org.exist.storage.serializers.EXistOutputKeys; import org.exist.util.DatabaseConfigurationException; import org.exist.xmldb.EXistCollection; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.EXistXQueryService; import org.exist.xmldb.XmldbURI; import org.junit.rules.ExternalResource; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.CompiledExpression; +import org.xmldb.api.base.Database; +import org.xmldb.api.base.ErrorCodes; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -199,43 +205,45 @@ private void stopXmlDb() throws XMLDBException { } - public ResourceSet executeQuery(final String query) throws XMLDBException { - return xpathQueryService.execute(new StringSource(query)); + public EXistResourceSet executeQuery(final String query) throws XMLDBException { + return (EXistResourceSet) xpathQueryService.execute(new StringSource(query)); } - public ResourceSet executeQuery(final String query, final Map externalVariables) + public EXistResourceSet executeQuery(final String query, final Map externalVariables) throws XMLDBException { for (final Map.Entry externalVariable : externalVariables.entrySet()) { xpathQueryService.declareVariable(externalVariable.getKey(), externalVariable.getValue()); } final CompiledExpression compiledQuery = xpathQueryService.compile(query); - final ResourceSet result = xpathQueryService.execute(compiledQuery); + final EXistResourceSet result = (EXistResourceSet) xpathQueryService.execute(compiledQuery); xpathQueryService.clearVariables(); return result; } public String executeOneValue(final String query) throws XMLDBException { - final ResourceSet results = executeQuery(query); - assertEquals(1, results.getSize()); - return results.getResource(0).getContent().toString(); + try (final EXistResourceSet results = executeQuery(query)) { + assertEquals(1, results.getSize()); + return results.getResource(0).getContent().toString(); + } } public Collection createCollection(final Collection collection, final String collectionName) throws XMLDBException { final CollectionManagementService collectionManagementService = collection.getService(CollectionManagementService.class); - Collection newCollection = collection.getChildCollection(collectionName); - if (newCollection == null) { - collectionManagementService.createCollection(collectionName); + try (final Collection existing = collection.getChildCollection(collectionName)) { + if (existing == null) { + try (final Collection created = collectionManagementService.createCollection(collectionName)) { + // no-op + } + } } final XmldbURI uri = XmldbURI.LOCAL_DB_URI.resolveCollectionPath(((EXistCollection) collection).getPathURI().append(collectionName)); if (asGuest) { - newCollection = DatabaseManager.getCollection(uri.toString(), TestUtils.GUEST_DB_USER, TestUtils.GUEST_DB_PWD); + return DatabaseManager.getCollection(uri.toString(), TestUtils.GUEST_DB_USER, TestUtils.GUEST_DB_PWD); } else { - newCollection = DatabaseManager.getCollection(uri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); + return DatabaseManager.getCollection(uri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); } - - return newCollection; } public void storeResource(final Collection collection, final String documentName, final byte[] content) diff --git a/exist-core/src/main/java/org/exist/util/CollectionScanner.java b/exist-core/src/main/java/org/exist/util/CollectionScanner.java index b419505dd6..c4e3bc1a18 100644 --- a/exist-core/src/main/java/org/exist/util/CollectionScanner.java +++ b/exist-core/src/main/java/org/exist/util/CollectionScanner.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -56,7 +80,9 @@ public final static void scan(List list, Collection current, String vp if (SelectorUtils.matchPatternStart(pattern, name)) ///TODO : use dedicated function in XmldbURI { - scan(list, current.getChildCollection(sub), name + "/", pattern); + try (final Collection child = current.getChildCollection(sub)) { + scan(list, child, name + "/", pattern); + } } } } diff --git a/exist-core/src/main/java/org/exist/xmldb/EXistResourceSet.java b/exist-core/src/main/java/org/exist/xmldb/EXistResourceSet.java new file mode 100644 index 0000000000..1fb2384fd9 --- /dev/null +++ b/exist-core/src/main/java/org/exist/xmldb/EXistResourceSet.java @@ -0,0 +1,37 @@ +/* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +package org.exist.xmldb; + +import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.XMLDBException; + +/** + * Extends {@link ResourceSet} with {@link AutoCloseable} to + * work around an issue in the XML:DB API, + * @see ResourceSet should extend AutoCloseable #251. + * + * @author Adam Retter + */ +public interface EXistResourceSet extends ResourceSet, AutoCloseable { + + @Override + void close() throws XMLDBException; +} diff --git a/exist-core/src/main/java/org/exist/xmldb/EXistXPathQueryService.java b/exist-core/src/main/java/org/exist/xmldb/EXistXPathQueryService.java index 6d7f8b245a..b310d644f3 100644 --- a/exist-core/src/main/java/org/exist/xmldb/EXistXPathQueryService.java +++ b/exist-core/src/main/java/org/exist/xmldb/EXistXPathQueryService.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -21,7 +45,6 @@ */ package org.exist.xmldb; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XPathQueryService; @@ -55,7 +78,7 @@ public interface EXistXPathQueryService extends XPathQueryService { * * @throws XMLDBException if an error occurs whilst executing the query */ - ResourceSet query(XMLResource res, String query) + EXistResourceSet query(XMLResource res, String query) throws XMLDBException; /** @@ -73,7 +96,7 @@ ResourceSet query(XMLResource res, String query) * * @throws XMLDBException if an error occurs whilst executing the query */ - ResourceSet query(XMLResource res, String query, String sortExpr) + EXistResourceSet query(XMLResource res, String query, String sortExpr) throws XMLDBException; /** @@ -89,7 +112,7 @@ ResourceSet query(XMLResource res, String query, String sortExpr) * * @throws XMLDBException if an error occurs whilst executing the query */ - ResourceSet query(String query, String sortExpr) + EXistResourceSet query(String query, String sortExpr) throws XMLDBException; /** @@ -101,7 +124,7 @@ ResourceSet query(String query, String sortExpr) * * @throws XMLDBException if an error occurs whilst executing the stored query */ - ResourceSet executeStoredQuery(String uri) throws XMLDBException; + EXistResourceSet executeStoredQuery(String uri) throws XMLDBException; /** * Declare an external XPath variable and assign a value to it. diff --git a/exist-core/src/main/java/org/exist/xmldb/EXistXQueryService.java b/exist-core/src/main/java/org/exist/xmldb/EXistXQueryService.java index d5c3f19f7e..05fe5817c0 100644 --- a/exist-core/src/main/java/org/exist/xmldb/EXistXQueryService.java +++ b/exist-core/src/main/java/org/exist/xmldb/EXistXQueryService.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -26,7 +50,6 @@ import org.exist.source.Source; import org.exist.xquery.XPathException; import org.xmldb.api.base.CompiledExpression; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XQueryService; @@ -43,17 +66,6 @@ */ public interface EXistXQueryService extends XQueryService { - /** - * Execute the specified query and return the results as a {@link ResourceSet}. - * - * @param query The query to execute. - * - * @return The query results - * - * @throws XMLDBException If an error occurs whilst executing the query - */ - ResourceSet query(String query) throws XMLDBException; - /** * Process a query based on the result of a previous query. * The XMLResource contains the result received from a previous @@ -66,23 +78,7 @@ public interface EXistXQueryService extends XQueryService { * * @throws XMLDBException If an error occurs whilst executing the query */ - ResourceSet query(XMLResource res, String query) throws XMLDBException; - - /** - * Compiles the specified XQuery and returns a handle to the compiled - * code, which can then be passed to {@link #execute(CompiledExpression)}. - * - * Note: {@link CompiledExpression} is not thread safe. Please make sure you don't - * call the same compiled expression from two threads at the same time. - * - * @param query The XQuery to compile - * - * @return a compiled representation of the query - * - * @throws XMLDBException if an error occurs whilst compiling the query - */ - @Override - CompiledExpression compile(String query) throws XMLDBException; + EXistResourceSet query(XMLResource res, String query) throws XMLDBException; /** * Tries to compile the specified XQuery and returns a handle to the compiled @@ -108,25 +104,7 @@ public interface EXistXQueryService extends XQueryService { * * @throws XMLDBException if an error occurs whilst executing the query */ - ResourceSet execute(Source querySource) throws XMLDBException; - - /** - * Execute a compiled XQuery. - * - * The implementation should pass all namespaces and variables declared through - * {@link EXistXQueryService} to the compiled XQuery code. - * - * Note: {@link CompiledExpression} is not thread safe. Please make sure you don't - * call the same compiled expression from two threads at the same time. - * - * @param compiledExpression a compiled query - * - * @return The results of the query - * - * @throws XMLDBException if an error occurs whilst executing the query - */ - @Override - ResourceSet execute(CompiledExpression compiledExpression) throws XMLDBException; + EXistResourceSet execute(Source querySource) throws XMLDBException; /** * Execute a compiled query based on the result of a previous query. @@ -146,96 +124,7 @@ public interface EXistXQueryService extends XQueryService { * * @throws XMLDBException if an error occurs whilst executing the query */ - ResourceSet execute(XMLResource res, CompiledExpression compiledExpression) throws XMLDBException; - - /** - * Returns the URI string associated with prefix from - * the internal namespace map. If prefix is null or empty the - * URI for the default namespace will be returned. If a mapping for the - * prefix can not be found null is returned. - * - * @param prefix The prefix to retrieve from the namespace map. - * - * @return The URI associated with prefix - * - * @throws XMLDBException with expected error codes. - * ErrorCodes.VENDOR_ERROR for any vendor - * specific errors that occur. - */ - @Override - String getNamespace(String prefix) throws XMLDBException; - - /** - * Sets a namespace mapping in the internal namespace map used to evaluate - * queries. If prefix is null or empty the default namespace is - * associated with the provided URI. A null or empty uri results - * in an exception being thrown. - * - * @param prefix The prefix to set in the map. If - * prefix is empty or null the - * default namespace will be associated with the provided URI. - * @param namespace The URI for the namespace to be associated with prefix. - * - * @throws XMLDBException with expected error codes. - * ErrorCodes.VENDOR_ERROR for any vendor - * specific errors that occur. - */ - @Override - void setNamespace(String prefix, String namespace) throws XMLDBException; - - /** - * Removes the namespace mapping associated with prefix from - * the internal namespace map. If prefix is null or empty the - * mapping for the default namespace will be removed. - * - * @param ns The prefix to remove from the namespace map. If - * prefix is null or empty the mapping for the default - * namespace will be removed. - * - * @throws XMLDBException with expected error codes. - * ErrorCodes.VENDOR_ERROR for any vendor - * specific errors that occur. - */ - @Override - void removeNamespace(String ns) throws XMLDBException; - - /** - * Declare a global, external XQuery variable and assign a value to it. The variable - * has the same status as a variable declare through the declare variable - * statement in the XQuery prolog. - * - * The variable can be referenced inside the XQuery expression as - * $variable. For example, if you declare a variable with - * - *
-     * 	declareVariable("name", "HAMLET");
-     * 
- * - * you may use the variable in an XQuery expression as follows: - * - *
-     * 	//SPEECH[SPEAKER=$name]
-     * 
- * - * Any Java object may be passed as initial value. The implementation will try - * to map the Java object into a corresponding XQuery value. In particular, all - * basic Java types (Integer, Long, Double, String) should be mapped into the corresponding XML - * Schema atomic types. A Java array is mapped to an XQuery sequence. The implemenation - * should also recognize all DOM node types. - * - * As a special case, an XMLResource as obtained from a {@link ResourceSet} will be - * converted into a node. - * - * @param qname a valid QName by which the variable is identified. Any - * prefix should have been mapped to a namespace, using {@link #setNamespace(String, String)}. - * For example, if a variable is called x:name, a prefix/namespace mapping should have - * been defined for prefix x before calling this method. - * @param initialValue the initial value, which is assigned to the variable - * - * @throws XMLDBException if an error occurs whilst declaring the variable. - */ - @Override - void declareVariable(String qname, Object initialValue) throws XMLDBException; + EXistResourceSet execute(XMLResource res, CompiledExpression compiledExpression) throws XMLDBException; /** * Clears any previously declared variables @@ -244,20 +133,6 @@ public interface EXistXQueryService extends XQueryService { */ void clearVariables() throws XMLDBException; - /** - * Enable or disable XPath 1.0 compatibility mode. In XPath 1.0 - * compatibility mode, some XQuery expressions will behave different. - * In particular, additional automatic type conversions will be applied - * to the operands of numeric operators. - * - * @param backwardsCompatible true to enable backward compatibility mode. - */ - @Override - void setXPathCompatibility(boolean backwardsCompatible); - - @Override - void setModuleLoadPath(String path); - /** * Return a diagnostic dump of the query. The query should have been executed * before calling this function. diff --git a/exist-core/src/main/java/org/exist/xmldb/LocalCollection.java b/exist-core/src/main/java/org/exist/xmldb/LocalCollection.java index 4260622892..77a8d0b6fd 100644 --- a/exist-core/src/main/java/org/exist/xmldb/LocalCollection.java +++ b/exist-core/src/main/java/org/exist/xmldb/LocalCollection.java @@ -77,7 +77,11 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; -import org.xmldb.api.base.*; +import org.xmldb.api.base.ErrorCodes; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.Service; +import org.xmldb.api.base.ServiceProviderCache; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.base.ServiceProviderCache.ProviderRegistry; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; @@ -250,9 +254,9 @@ public R createResource(String id, Class type) throws XM } final R r; if (XMLResource.class.isAssignableFrom(type)) { - r = (R)new LocalXMLResource(user, brokerPool, this, idURI); + r = (R) new LocalXMLResource(user, brokerPool, this, idURI); } else if (BinaryResource.class.isAssignableFrom(type)) { - r = (R)new LocalBinaryResource(user, brokerPool, this, idURI); + r = (R) new LocalBinaryResource(user, brokerPool, this, idURI); } else { throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, "Unknown resource type: " + type); } diff --git a/exist-core/src/main/java/org/exist/xmldb/LocalResourceSet.java b/exist-core/src/main/java/org/exist/xmldb/LocalResourceSet.java index 63b955c853..aaf8f50474 100644 --- a/exist-core/src/main/java/org/exist/xmldb/LocalResourceSet.java +++ b/exist-core/src/main/java/org/exist/xmldb/LocalResourceSet.java @@ -71,12 +71,13 @@ import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; -public class LocalResourceSet extends AbstractLocal implements ResourceSet { +public class LocalResourceSet extends AbstractLocal implements ResourceSet, EXistResourceSet { - private final static Logger LOG = LogManager.getLogger(LocalResourceSet.class); + private static final Logger LOG = LogManager.getLogger(LocalResourceSet.class); private final List resources = new ArrayList<>(); private final Properties outputProperties; + private boolean closed; private final Runnable queryResultCloser; public LocalResourceSet(final Subject user, final BrokerPool pool, final LocalCollection col, final Properties properties, final XQueryUtil.QueryResult queryResult, final String sortExpr) throws XMLDBException { @@ -255,6 +256,21 @@ public void removeResource(final long pos) throws XMLDBException { resources.remove(pos); } + public final boolean isClosed() { + return closed; + } + + @Override + public void close() throws XMLDBException { + if (!isClosed()) { + try { + clear(); + } finally { + closed = true; + } + } + } + class NewResourceIterator implements ResourceIterator { long pos = 0; diff --git a/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java b/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java index 920c8c566a..4830729dce 100644 --- a/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java +++ b/exist-core/src/main/java/org/exist/xmldb/LocalXPathQueryService.java @@ -72,7 +72,8 @@ import org.exist.xquery.value.AnyURIValue; import org.exist.xquery.value.Sequence; import org.w3c.dom.Node; -import org.xmldb.api.base.*; +import org.xmldb.api.base.CompiledExpression; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.base.ErrorCodes; import org.xmldb.api.modules.XMLResource; @@ -141,17 +142,17 @@ public void setProperty(final String property, final String value) throws XMLDBE } @Override - public ResourceSet query(final String query) throws XMLDBException { + public EXistResourceSet query(final String query) throws XMLDBException { return query(query, null); } @Override - public ResourceSet query(final XMLResource res, final String query) throws XMLDBException { + public EXistResourceSet query(final XMLResource res, final String query) throws XMLDBException { return query(res, query, null); } @Override - public ResourceSet query(final String query, final String sortBy) throws XMLDBException { + public EXistResourceSet query(final String query, final String sortBy) throws XMLDBException { return withDb((broker, transaction) -> { final XmldbURI[] docs = new XmldbURI[] { XmldbURI.create(collection.getName(broker, transaction)) }; return doQuery(broker, transaction, query, docs, null, sortBy); @@ -159,7 +160,7 @@ public ResourceSet query(final String query, final String sortBy) throws XMLDBEx } @Override - public ResourceSet query(final XMLResource res, final String query, final String sortBy) throws XMLDBException { + public EXistResourceSet query(final XMLResource res, final String query, final String sortBy) throws XMLDBException { final Node n = ((LocalXMLResource) res).root; return withDb((broker, transaction) -> { @@ -182,7 +183,7 @@ public ResourceSet query(final XMLResource res, final String query, final String }); } - private ResourceSet doQuery(final DBBroker broker, final Txn transaction, final String query, final XmldbURI[] docs, final Sequence contextSet, final String sortExpr) throws XMLDBException { + private EXistResourceSet doQuery(final DBBroker broker, final Txn transaction, final String query, final XmldbURI[] docs, final Sequence contextSet, final String sortExpr) throws XMLDBException { final Either maybeExpr = compileAndCheck(broker, transaction, query); if(maybeExpr.isLeft()) { final XPathException e = maybeExpr.left().get(); @@ -193,13 +194,13 @@ private ResourceSet doQuery(final DBBroker broker, final Txn transaction, final } @Override - public ResourceSet execute(final CompiledExpression expression) throws XMLDBException { + public EXistResourceSet execute(final CompiledExpression expression) throws XMLDBException { return withDb((broker, transaction) -> execute(broker, transaction, null, null, expression, null)); } @Override - public ResourceSet execute(final XMLResource res, final CompiledExpression expression) throws XMLDBException { + public EXistResourceSet execute(final XMLResource res, final CompiledExpression expression) throws XMLDBException { return withDb((broker, transaction) -> { final NodeProxy node = ((LocalXMLResource) res).getNode(broker, transaction); if (node == null) { @@ -215,7 +216,7 @@ public ResourceSet execute(final XMLResource res, final CompiledExpression expre }); } - private ResourceSet execute(final DBBroker broker, final Txn transaction, XmldbURI[] docs, final Sequence contextSet, final CompiledExpression expression, final String sortExpr) throws XMLDBException { + private EXistResourceSet execute(final DBBroker broker, final Txn transaction, XmldbURI[] docs, final Sequence contextSet, final CompiledExpression expression, final String sortExpr) throws XMLDBException { final CompiledXQuery expr = (CompiledXQuery) expression; final XQueryContext context = expr.getContext(); @@ -249,7 +250,7 @@ private ResourceSet execute(final DBBroker broker, final Txn transaction, XmldbU resourceSetProperties.setProperty(EXistOutputKeys.XDM_SERIALIZATION, "yes"); // NOTE(AR) LocalResourceSet takes ownership of QueryResult sequence! So it is responsible to call `QueryResult#close()` when it is finished with it - final ResourceSet resourceSet = new LocalResourceSet(user, brokerPool, collection, resourceSetProperties, queryResult, sortExpr); + final EXistResourceSet resourceSet = new LocalResourceSet(user, brokerPool, collection, resourceSetProperties, queryResult, sortExpr); queryResultOwnershipTransferred = true; return resourceSet; @@ -270,12 +271,12 @@ private ResourceSet execute(final DBBroker broker, final Txn transaction, XmldbU } @Override - public ResourceSet execute(final Source source) throws XMLDBException { + public EXistResourceSet execute(final Source source) throws XMLDBException { return execute((broker, transaction) -> source); } @Override - public ResourceSet executeStoredQuery(final String uri) throws XMLDBException { + public EXistResourceSet executeStoredQuery(final String uri) throws XMLDBException { return execute((broker, transaction) -> { final DocumentImpl resource = broker.getResource(new XmldbURI(uri), Permission.READ | Permission.EXECUTE); if (resource == null) { @@ -285,7 +286,7 @@ public ResourceSet executeStoredQuery(final String uri) throws XMLDBException { }); } - private ResourceSet execute(final LocalXmldbFunction sourceOp) throws XMLDBException { + private EXistResourceSet execute(final LocalXmldbFunction sourceOp) throws XMLDBException { return withDb((broker, transaction) -> { final Source source = sourceOp.apply(broker, transaction); @@ -319,7 +320,7 @@ private ResourceSet execute(final LocalXmldbFunction sourceOp) throws XM resourceSetProperties.setProperty(EXistOutputKeys.XDM_SERIALIZATION, "yes"); // NOTE(AR) LocalResourceSet takes ownership of QueryResult sequence! So it is responsible to call `QueryResult#close()` when it is finished with it - final ResourceSet resourceSet = new LocalResourceSet(user, brokerPool, collection, resourceSetProperties, queryResult, null); + final EXistResourceSet resourceSet = new LocalResourceSet(user, brokerPool, collection, resourceSetProperties, queryResult, null); queryResultOwnershipTransferred = true; return resourceSet; @@ -383,7 +384,7 @@ private Either compileAndCheck(final DBBroke } @Override - public ResourceSet queryResource(final String resource, final String query) throws XMLDBException { + public EXistResourceSet queryResource(final String resource, final String query) throws XMLDBException { return withDb((broker, transaction) -> { final LocalXMLResource res = (LocalXMLResource) collection.getResource(broker, transaction, resource); if (res == null) { diff --git a/exist-core/src/main/java/org/exist/xmldb/MapResourceSet.java b/exist-core/src/main/java/org/exist/xmldb/MapResourceSet.java index c0826e1396..aa60da262f 100644 --- a/exist-core/src/main/java/org/exist/xmldb/MapResourceSet.java +++ b/exist-core/src/main/java/org/exist/xmldb/MapResourceSet.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -39,8 +63,7 @@ * * @author Jean-Marc Vanel (2 April 2003) */ -public class MapResourceSet implements ResourceSet -{ +public class MapResourceSet implements ResourceSet, EXistResourceSet { private final Map resources; private final List resourcesVector = new ArrayList<>(); @@ -96,6 +119,11 @@ public void clear() throws XMLDBException { resources.clear(); } + @Override + public void close() throws XMLDBException { + clear(); + } + /** * Get an iterator over the resource set. * diff --git a/exist-core/src/main/java/org/exist/xmldb/RemoteCollection.java b/exist-core/src/main/java/org/exist/xmldb/RemoteCollection.java index b53c03ceee..d271bfff05 100644 --- a/exist-core/src/main/java/org/exist/xmldb/RemoteCollection.java +++ b/exist-core/src/main/java/org/exist/xmldb/RemoteCollection.java @@ -79,9 +79,13 @@ import org.exist.util.crypto.digest.MessageDigest; import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream; import org.xml.sax.InputSource; -import org.xmldb.api.base.*; import org.xmldb.api.base.Collection; +import org.xmldb.api.base.ErrorCodes; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.Service; +import org.xmldb.api.base.ServiceProviderCache; import org.xmldb.api.base.ServiceProviderCache.ProviderRegistry; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; diff --git a/exist-core/src/main/java/org/exist/xmldb/RemoteResourceSet.java b/exist-core/src/main/java/org/exist/xmldb/RemoteResourceSet.java index cc0b6b3a26..de4f6ea7e5 100644 --- a/exist-core/src/main/java/org/exist/xmldb/RemoteResourceSet.java +++ b/exist-core/src/main/java/org/exist/xmldb/RemoteResourceSet.java @@ -81,7 +81,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; -public class RemoteResourceSet implements ResourceSet, AutoCloseable { +public class RemoteResourceSet implements ResourceSet, EXistResourceSet { private final Leasable leasableXmlRpcClient; private final RemoteCollection collection; @@ -92,7 +92,7 @@ public class RemoteResourceSet implements ResourceSet, AutoCloseable { private boolean closed; private LazyVal inMemoryBufferSize; - private static Logger LOG = LogManager.getLogger(RemoteResourceSet.class.getName()); + private static final Logger LOG = LogManager.getLogger(RemoteResourceSet.class); public RemoteResourceSet(final Leasable leasableXmlRpcClient, final RemoteCollection col, final Properties properties, final Object[] resources, final int handle, final int hash) { this.leasableXmlRpcClient = leasableXmlRpcClient; @@ -127,10 +127,12 @@ public void clear() throws XMLDBException { if (handle < 0) { return; } + final List params = new ArrayList<>(); params.add(handle); - if (hash > -1) + if (hash > -1) { params.add(hash); + } collection.execute("releaseQueryResult", params); hash = -1; resources.clear(); diff --git a/exist-core/src/main/java/org/exist/xmldb/RemoteXPathQueryService.java b/exist-core/src/main/java/org/exist/xmldb/RemoteXPathQueryService.java index 4461cc1bc8..d033263478 100644 --- a/exist-core/src/main/java/org/exist/xmldb/RemoteXPathQueryService.java +++ b/exist-core/src/main/java/org/exist/xmldb/RemoteXPathQueryService.java @@ -56,7 +56,11 @@ import org.exist.util.Leasable; import org.exist.xmlrpc.RpcAPI; import org.exist.xquery.XPathException; -import org.xmldb.api.base.*; +import org.xmldb.api.base.CompiledExpression; +import org.xmldb.api.base.ErrorCodes; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import javax.annotation.Nullable; @@ -102,7 +106,7 @@ public ResourceSet query(final String query) throws XMLDBException { } @Override - public ResourceSet query(final String query, final String sortExpr) + public EXistResourceSet query(final String query, final String sortExpr) throws XMLDBException { final Map optParams = new HashMap<>(); @@ -211,7 +215,7 @@ private XPathException errorToXPathException(final Map result) { } @Override - public ResourceSet execute(final Source source) throws XMLDBException { + public EXistResourceSet execute(final Source source) throws XMLDBException { try { final String xq = source.getContent(); return query(xq, null); @@ -221,7 +225,7 @@ public ResourceSet execute(final Source source) throws XMLDBException { } @Override - public ResourceSet executeStoredQuery(final String uri) throws XMLDBException { + public EXistResourceSet executeStoredQuery(final String uri) throws XMLDBException { final List params = new ArrayList<>(); params.add(uri); @@ -247,13 +251,13 @@ public ResourceSet executeStoredQuery(final String uri) throws XMLDBException { } @Override - public ResourceSet query(final XMLResource res, final String query) + public EXistResourceSet query(final XMLResource res, final String query) throws XMLDBException { return query(res, query, null); } @Override - public ResourceSet query(final XMLResource res, final String query, final String sortExpr) + public EXistResourceSet query(final XMLResource res, final String query, final String sortExpr) throws XMLDBException { final RemoteXMLResource resource = (RemoteXMLResource) res; final Map optParams = new HashMap<>(); @@ -299,7 +303,7 @@ public ResourceSet query(final XMLResource res, final String query, final String } @Override - public ResourceSet queryResource(final String resource, final String query) throws XMLDBException { + public EXistResourceSet queryResource(final String resource, final String query) throws XMLDBException { final Resource res = collection.getResource(resource); try { if (res == null) { @@ -367,7 +371,7 @@ public ResourceSet execute(final CompiledExpression expression) throws XMLDBExce } @Override - public ResourceSet execute(final XMLResource res, final CompiledExpression expression) throws XMLDBException { + public EXistResourceSet execute(final XMLResource res, final CompiledExpression expression) throws XMLDBException { return query(res, ((RemoteCompiledExpression) expression).getQuery()); } diff --git a/exist-core/src/main/java/org/exist/xmlrpc/RpcConnection.java b/exist-core/src/main/java/org/exist/xmlrpc/RpcConnection.java index 070555f949..7691ea04d4 100644 --- a/exist-core/src/main/java/org/exist/xmlrpc/RpcConnection.java +++ b/exist-core/src/main/java/org/exist/xmlrpc/RpcConnection.java @@ -143,7 +143,7 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; -import org.xmldb.api.base.*; +import org.xmldb.api.base.XMLDBException; import xyz.elemental.mediatype.MediaType; import xyz.elemental.mediatype.MediaTypeResolver; diff --git a/exist-core/src/main/java/org/exist/xquery/XPathUtil.java b/exist-core/src/main/java/org/exist/xquery/XPathUtil.java index dbe64ffb42..c236020196 100644 --- a/exist-core/src/main/java/org/exist/xquery/XPathUtil.java +++ b/exist-core/src/main/java/org/exist/xquery/XPathUtil.java @@ -685,7 +685,9 @@ public static final Sequence javaObjectToXPath(final Object obj, final XQueryCon try { final DBBroker broker = context.getBroker(); for (final ResourceIterator it = ((ResourceSet) obj).getIterator(); it.hasMoreResources();) { - seq.add(getNode(broker, (XMLResource) it.nextResource(), expression)); + try (final XMLResource xres = (XMLResource) it.nextResource()) { + seq.add(getNode(broker, xres, expression)); + } } } catch (final XMLDBException xe) { throw new XPathException(expression, "Failed to convert ResourceSet to node: " + xe.getMessage()); @@ -926,7 +928,7 @@ public static final NodeProxy getNode(DBBroker broker, XMLResource xres) throws * @return A NodeProxy for accessing the content represented by xres * @throws XPathException if an XMLDBException is encountered */ - public static final NodeProxy getNode(DBBroker broker, XMLResource xres, final Expression expression) throws XPathException { + public static final NodeProxy getNode(final DBBroker broker, final XMLResource xres, final Expression expression) throws XPathException { if (xres instanceof LocalXMLResource lres) { try { return lres.getNode(); diff --git a/exist-core/src/main/java/org/exist/xquery/functions/xmldb/XMLDBAbstractCollectionManipulator.java b/exist-core/src/main/java/org/exist/xquery/functions/xmldb/XMLDBAbstractCollectionManipulator.java index 1af5b1b3d4..b4d90618e1 100644 --- a/exist-core/src/main/java/org/exist/xquery/functions/xmldb/XMLDBAbstractCollectionManipulator.java +++ b/exist-core/src/main/java/org/exist/xquery/functions/xmldb/XMLDBAbstractCollectionManipulator.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -44,6 +68,8 @@ import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; +import javax.annotation.Nullable; + import static org.exist.xquery.XPathException.execAndAddErrorIfMissing; /** @@ -118,65 +144,66 @@ public Sequence eval(final Sequence[] args, final Sequence contextSequence) throw new XPathException(this, "Expected a collection as the argument " + (paramNumber + 1) + "."); } - final boolean collectionNeedsClose = false; - - Collection collection = null; - final Item item = args[paramNumber].itemAt(0); - if (Type.subTypeOf(item.getType(), Type.NODE)) { - final NodeValue node = (NodeValue) item; - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Found node"); - } - if (node.getImplementationType() == NodeValue.PERSISTENT_NODE) { - final org.exist.collections.Collection internalCol = ((NodeProxy) node).getOwnerDocument().getCollection(); + @Nullable Collection collection = null; + try { + final Item item = args[paramNumber].itemAt(0); + if (Type.subTypeOf(item.getType(), Type.NODE)) { + final NodeValue node = (NodeValue) item; if (LOGGER.isDebugEnabled()) { LOGGER.debug("Found node"); } - try { - //TODO: use xmldbURI - collection = getLocalCollection(this, context, internalCol.getURI().toString()); + + if (node.getImplementationType() == NodeValue.PERSISTENT_NODE) { + final org.exist.collections.Collection internalCol = ((NodeProxy) node).getOwnerDocument().getCollection(); if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Loaded collection {}", collection.getName()); + LOGGER.debug("Found node"); } - } catch (final XMLDBException e) { - throw new XPathException(this, "Failed to access collection: " + internalCol.getURI(), e); + + try { + //TODO: use xmldbURI + collection = getLocalCollection(this, context, internalCol.getURI().toString()); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Loaded collection {}", collection.getName()); + } + } catch (final XMLDBException e) { + throw new XPathException(this, "Failed to access collection: " + internalCol.getURI(), e); + } + + } else { + return Sequence.EMPTY_SEQUENCE; } - } else { - return Sequence.EMPTY_SEQUENCE; } - } - if (collection == null) { - //Otherwise, just extract the name as a string: - final String collectionURI = args[paramNumber].getStringValue(); - if (collectionURI != null) { - try { - collection = getCollection(this, context, collectionURI, Optional.empty(), Optional.empty()); - } catch (final XMLDBException xe) { - if (errorIfAbsent) { - throw new XPathException(this, "Could not locate collection: " + collectionURI, xe); + if (collection == null) { + // Otherwise, just extract the name as a string: + final String collectionURI = args[paramNumber].getStringValue(); + if (collectionURI != null) { + + try { + collection = getCollection(this, context, collectionURI, Optional.empty(), Optional.empty()); + } catch (final XMLDBException xe) { + if (errorIfAbsent) { + throw new XPathException(this, "Could not locate collection: " + collectionURI, xe); + } } - collection = null; + } + + if (collection == null && errorIfAbsent) { + throw new XPathException(this, "Unable to find collection: " + collectionURI); } } - if (collection == null && errorIfAbsent) { - throw new XPathException(this, "Unable to find collection: " + collectionURI); - } - } - Sequence s = Sequence.EMPTY_SEQUENCE; - try { - s = evalWithCollection(collection, args, contextSequence); + return evalWithCollection(collection, args, contextSequence); + } finally { - if (collectionNeedsClose && collection != null) { + if (collection != null) { try { collection.close(); - } catch (final Exception e) { + } catch (final XMLDBException e) { throw new XPathException(this, "Unable to close collection", e); } } } - return s; } abstract protected Sequence evalWithCollection(final Collection c, final Sequence[] args, final Sequence contextSequence) throws XPathException; diff --git a/exist-core/src/main/java/org/exist/xquery/functions/xmldb/XMLDBLoadFromPattern.java b/exist-core/src/main/java/org/exist/xquery/functions/xmldb/XMLDBLoadFromPattern.java index 877c2c347b..6b5b353aba 100644 --- a/exist-core/src/main/java/org/exist/xquery/functions/xmldb/XMLDBLoadFromPattern.java +++ b/exist-core/src/main/java/org/exist/xquery/functions/xmldb/XMLDBLoadFromPattern.java @@ -224,15 +224,16 @@ protected Sequence evalWithCollection(Collection collection, Sequence[] args, Se //TODO : these probably need to be encoded and checked for right mime type final Class type = mediaType.getStorageType() == StorageType.XML ? XMLResource.class : BinaryResource.class; - final Resource resource = col.createResource(FileUtils.fileName(file), type); - resource.setContent(file.toFile()); + try (final Resource resource = col.createResource(FileUtils.fileName(file), type)) { + resource.setContent(file.toFile()); - ((EXistResource) resource).setMediaType(mediaType.getIdentifier()); + ((EXistResource) resource).setMediaType(mediaType.getIdentifier()); - col.storeResource(resource); + col.storeResource(resource); - //TODO : use dedicated function in XmldbURI - stored.add(new StringValue(this, col.getName() + "/" + resource.getId())); + //TODO : use dedicated function in XmldbURI + stored.add(new StringValue(this, col.getName() + "/" + resource.getId())); + } } catch (final XMLDBException e) { logger.error("Could not store file {}: {}", file.toAbsolutePath(), e.getMessage()); } diff --git a/exist-core/src/test/java/org/exist/TestDataGenerator.java b/exist-core/src/test/java/org/exist/TestDataGenerator.java index 5aab4b2ce5..b39f8a7a1a 100644 --- a/exist-core/src/test/java/org/exist/TestDataGenerator.java +++ b/exist-core/src/test/java/org/exist/TestDataGenerator.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -32,6 +56,7 @@ import org.exist.util.FileUtils; import org.exist.util.LockException; import org.exist.util.serializer.SAXSerializer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xquery.CompiledXQuery; import org.exist.xquery.XPathException; import org.exist.xquery.XQuery; @@ -40,7 +65,6 @@ import org.xml.sax.SAXException; import org.xmldb.api.base.CompiledExpression; import org.xmldb.api.base.ResourceIterator; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XQueryService; @@ -133,13 +157,14 @@ public Path[] generate(final org.xmldb.api.base.Collection collection, final Str service.declareVariable("filename", generatedFiles[i].getFileName().toString()); service.declareVariable("count", Integer.valueOf(i)); - final ResourceSet result = service.execute(compiled); - - try(final Writer out = Files.newBufferedWriter(generatedFiles[i], StandardCharsets.UTF_8)) { - final SAXSerializer sax = new SAXSerializer(out, outputProps); - for (ResourceIterator iter = result.getIterator(); iter.hasMoreResources(); ) { - try (XMLResource r = (XMLResource) iter.nextResource()) { - r.getContentAsSAX(sax); + try (final EXistResourceSet result = (EXistResourceSet) service.execute(compiled)) { + + try (final Writer out = Files.newBufferedWriter(generatedFiles[i], StandardCharsets.UTF_8)) { + final SAXSerializer sax = new SAXSerializer(out, outputProps); + for (ResourceIterator iter = result.getIterator(); iter.hasMoreResources(); ) { + try (XMLResource r = (XMLResource) iter.nextResource()) { + r.getContentAsSAX(sax); + } } } } diff --git a/exist-core/src/test/java/org/exist/backup/XMLDBBackupTest.java b/exist-core/src/test/java/org/exist/backup/XMLDBBackupTest.java index 037f6cde8b..1372987ef9 100644 --- a/exist-core/src/test/java/org/exist/backup/XMLDBBackupTest.java +++ b/exist-core/src/test/java/org/exist/backup/XMLDBBackupTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -114,29 +138,34 @@ public void backupRestore() throws XMLDBException, SAXException, IOException, UR restore(backupFile, XmldbURI.create(getBaseUri()).append("/db")); // check restore has restored the collection - final Collection testCollection = DatabaseManager.getCollection(collectionUri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - assertNotNull(testCollection); + try (final Collection testCollection = DatabaseManager.getCollection(collectionUri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + assertNotNull(testCollection); - final Resource doc1 = testCollection.getResource(DOC1_NAME); - assertNotNull(doc1); + try (final Resource doc1 = testCollection.getResource(DOC1_NAME)) { + assertNotNull(doc1); - // NOTE(AR) that org.exist.backup.Backup calls defaultOutputProperties.setProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); - // NOTE(AR) that org.exist.backup.SystemExport also calls defaultOutputProperties.setProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); - // TODO(AR) consider whether the backup/export should be injecting a XML Declaration that was not previously present, or should default to EXistOutputKeys.OMIT_ORIGINAL_XML_DECLARATION - final Source expected = Input.fromString("\n" + doc1Content).build(); - final Source actual = Input.fromString(doc1.getContent().toString()).build(); - final Diff diff = DiffBuilder.compare(expected) - .withTest(actual) - .checkForIdentical() - .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + // NOTE(AR) that org.exist.backup.Backup calls defaultOutputProperties.setProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); + // NOTE(AR) that org.exist.backup.SystemExport also calls defaultOutputProperties.setProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); + // TODO(AR) consider whether the backup/export should be injecting a XML Declaration that was not previously present, or should default to EXistOutputKeys.OMIT_ORIGINAL_XML_DECLARATION + final Source expected = Input.fromString("\n" + doc1Content).build(); - final Resource binDoc1 = testCollection.getResource(BIN_DOC1_NAME); - assertEquals(binDoc1Content, new String((byte[])binDoc1.getContent(), UTF_8)); + final Source actual = Input.fromString(doc1.getContent().toString()).build(); + final Diff diff = DiffBuilder.compare(expected) + .withTest(actual) + .checkForIdentical() + .build(); + assertFalse(diff.toString(), diff.hasDifferences()); + } - final Resource binDoc2 = testCollection.getResource(BIN_DOC2_NAME); - assertEquals(binDoc2Content, new String((byte[])binDoc2.getContent(), UTF_8)); + try (final Resource binDoc1 = testCollection.getResource(BIN_DOC1_NAME)) { + assertEquals(binDoc1Content, new String((byte[]) binDoc1.getContent(), UTF_8)); + } + + try (final Resource binDoc2 = testCollection.getResource(BIN_DOC2_NAME)) { + assertEquals(binDoc2Content, new String((byte[]) binDoc2.getContent(), UTF_8)); + } + } } private Path backup(final String filename, final XmldbURI collectionUri) throws IOException, XMLDBException, SAXException { @@ -151,36 +180,43 @@ private Path backup(final String filename, final XmldbURI collectionUri) throws } private void restore(final Path backupFile, final XmldbURI collectionUri) throws XMLDBException, SAXException, URISyntaxException, ParserConfigurationException, IOException { - final Collection collection = DatabaseManager.getCollection(collectionUri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final EXistRestoreService restoreService = collection.getService(EXistRestoreService.class); - final TestRestoreListener listener = new TestRestoreListener(); - restoreService.restore(backupFile.normalize().toAbsolutePath().toString(), null, listener, false); + try (final Collection collection = DatabaseManager.getCollection(collectionUri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final EXistRestoreService restoreService = collection.getService(EXistRestoreService.class); + final TestRestoreListener listener = new TestRestoreListener(); + restoreService.restore(backupFile.normalize().toAbsolutePath().toString(), null, listener, false); + } } private void deleteCollection(final XmldbURI collectionUri) throws XMLDBException { - final Collection parent = DatabaseManager.getCollection(collectionUri.removeLastSegment().toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService colService = parent.getService(CollectionManagementService.class); - colService.removeCollection(collectionUri.lastSegment().toString()); + try (final Collection parent = DatabaseManager.getCollection(collectionUri.removeLastSegment().toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService colService = parent.getService(CollectionManagementService.class); + colService.removeCollection(collectionUri.lastSegment().toString()); + } } @Before public void before() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService colService = root.getService(CollectionManagementService.class); - final Collection testCollection = colService.createCollection(COLLECTION_NAME); - assertNotNull(testCollection); - - final Resource doc1 = testCollection.createResource(DOC1_NAME, XMLResource.class); - doc1.setContent(doc1Content); - testCollection.storeResource(doc1); - - final Resource binDoc1 = testCollection.createResource(BIN_DOC1_NAME, BinaryResource.class); - binDoc1.setContent(binDoc1Content); - testCollection.storeResource(binDoc1); - - final Resource binDoc2 = testCollection.createResource(BIN_DOC2_NAME, BinaryResource.class); - binDoc2.setContent(binDoc2Content); - testCollection.storeResource(binDoc2); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService colService = root.getService(CollectionManagementService.class); + try (final Collection testCollection = colService.createCollection(COLLECTION_NAME)) { + assertNotNull(testCollection); + + try (final Resource doc1 = testCollection.createResource(DOC1_NAME, XMLResource.class)) { + doc1.setContent(doc1Content); + testCollection.storeResource(doc1); + } + + try (final Resource binDoc1 = testCollection.createResource(BIN_DOC1_NAME, BinaryResource.class)) { + binDoc1.setContent(binDoc1Content); + testCollection.storeResource(binDoc1); + } + + try (final Resource binDoc2 = testCollection.createResource(BIN_DOC2_NAME, BinaryResource.class)) { + binDoc2.setContent(binDoc2Content); + testCollection.storeResource(binDoc2); + } + } + } } private static class TestRestoreListener extends AbstractRestoreServiceTaskListener { diff --git a/exist-core/src/test/java/org/exist/backup/XMLDBRestoreTest.java b/exist-core/src/test/java/org/exist/backup/XMLDBRestoreTest.java index 905306e1e5..277f903628 100644 --- a/exist-core/src/test/java/org/exist/backup/XMLDBRestoreTest.java +++ b/exist-core/src/test/java/org/exist/backup/XMLDBRestoreTest.java @@ -221,12 +221,13 @@ public void restoreUserWithoutGroupIsPlacedInNoGroup() throws IOException, XMLDB assertEquals(0, listener.warnings.size()); assertEquals(0, listener.errors.size()); - final Collection collection = DatabaseManager.getCollection(rootUri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final EXistUserManagementService userManagementService = collection.getService(EXistUserManagementService.class); - final Account account = userManagementService.getAccount(username); - assertNotNull(account); - assertEquals(SecurityManager.UNKNOWN_GROUP, account.getPrimaryGroup()); - assertArrayEquals(new String[]{SecurityManager.UNKNOWN_GROUP}, account.getGroups()); + try (final Collection collection = DatabaseManager.getCollection(rootUri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final EXistUserManagementService userManagementService = collection.getService(EXistUserManagementService.class); + final Account account = userManagementService.getAccount(username); + assertNotNull(account); + assertEquals(SecurityManager.UNKNOWN_GROUP, account.getPrimaryGroup()); + assertArrayEquals(new String[]{SecurityManager.UNKNOWN_GROUP}, account.getGroups()); + } } @Test @@ -242,12 +243,13 @@ public void restoreUserWithNoSuchGroupIsPlacedInNoGroup() throws IOException, XM assertEquals(0, listener.warnings.size()); assertEquals(0, listener.errors.size()); - final Collection collection = DatabaseManager.getCollection(rootUri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final EXistUserManagementService userManagementService = collection.getService(EXistUserManagementService.class); - final Account account = userManagementService.getAccount(username); - assertNotNull(account); - assertEquals(SecurityManager.UNKNOWN_GROUP, account.getPrimaryGroup()); - assertArrayEquals(new String[]{SecurityManager.UNKNOWN_GROUP}, account.getGroups()); + try (final Collection collection = DatabaseManager.getCollection(rootUri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final EXistUserManagementService userManagementService = collection.getService(EXistUserManagementService.class); + final Account account = userManagementService.getAccount(username); + assertNotNull(account); + assertEquals(SecurityManager.UNKNOWN_GROUP, account.getPrimaryGroup()); + assertArrayEquals(new String[]{SecurityManager.UNKNOWN_GROUP}, account.getGroups()); + } } /** @@ -309,34 +311,38 @@ private void restoreUserWithGroups(final Path backupPath, final Path restorePath assertEquals(0, listener.warnings.size()); assertEquals(0, listener.errors.size()); - final Collection collection = DatabaseManager.getCollection(rootUri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final EXistUserManagementService userManagementService = collection.getService(EXistUserManagementService.class); - final Account account = userManagementService.getAccount(username); - assertNotNull(account); - assertEquals(primaryGroup, account.getPrimaryGroup()); - assertArrayEquals(new String[]{primaryGroup, group1, group2, group3}, account.getGroups()); + try (final Collection collection = DatabaseManager.getCollection(rootUri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final EXistUserManagementService userManagementService = collection.getService(EXistUserManagementService.class); + final Account account = userManagementService.getAccount(username); + assertNotNull(account); + assertEquals(primaryGroup, account.getPrimaryGroup()); + assertArrayEquals(new String[]{primaryGroup, group1, group2, group3}, account.getGroups()); + } } private static void restoreBackup(final XmldbURI uri, final Path backup, @Nullable final String backupPassword, final RestoreServiceTaskListener listener) throws XMLDBException { - final Collection collection = DatabaseManager.getCollection(uri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final EXistRestoreService restoreService = collection.getService(EXistRestoreService.class); - restoreService.restore(backup.normalize().toAbsolutePath().toString(), backupPassword, listener, false); + try (final Collection collection = DatabaseManager.getCollection(uri.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final EXistRestoreService restoreService = collection.getService(EXistRestoreService.class); + restoreService.restore(backup.normalize().toAbsolutePath().toString(), backupPassword, listener, false); + } } private void checkMediaType(final XmldbURI collectionUri, final DocInfo backupDocInfo) throws XMLDBException { - final Collection collection = DatabaseManager.getCollection(XmldbURI.create(getBaseUri()).append(collectionUri).toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final Resource resource = collection.getResource(backupDocInfo.name); - if (backupDocInfo.storageType == StorageType.XML) { - assertTrue(resource instanceof XMLResource); - } else { - assertTrue(resource instanceof BinaryResource); - } - if (backupDocInfo.mediaType != null) { - assertEquals(backupDocInfo.mediaType, ((EXistResource) resource).getMediaType()); - } else if (backupDocInfo.storageType == StorageType.XML) { - assertEquals(MediaType.APPLICATION_XML, ((EXistResource) resource).getMediaType()); - } else { - assertEquals(MediaType.APPLICATION_OCTET_STREAM, ((EXistResource) resource).getMediaType()); + try (final Collection collection = DatabaseManager.getCollection(XmldbURI.create(getBaseUri()).append(collectionUri).toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + try (final Resource resource = collection.getResource(backupDocInfo.name)) { + if (backupDocInfo.storageType == StorageType.XML) { + assertTrue(resource instanceof XMLResource); + } else { + assertTrue(resource instanceof BinaryResource); + } + if (backupDocInfo.mediaType != null) { + assertEquals(backupDocInfo.mediaType, ((EXistResource) resource).getMediaType()); + } else if (backupDocInfo.storageType == StorageType.XML) { + assertEquals(MediaType.APPLICATION_XML, ((EXistResource) resource).getMediaType()); + } else { + assertEquals(MediaType.APPLICATION_OCTET_STREAM, ((EXistResource) resource).getMediaType()); + } + } } } diff --git a/exist-core/src/test/java/org/exist/client/InteractiveClientTest.java b/exist-core/src/test/java/org/exist/client/InteractiveClientTest.java index b96f7629e3..a64a34a204 100644 --- a/exist-core/src/test/java/org/exist/client/InteractiveClientTest.java +++ b/exist-core/src/test/java/org/exist/client/InteractiveClientTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -82,7 +106,7 @@ void setUp() throws URISyntaxException { client = new InteractiveClient(CommandlineOptions.parse(new String[0])) { @Override protected void connect() throws Exception { - current = collection; + setCollection(collection); } }; client.frame = clientFrame; @@ -98,7 +122,7 @@ void getResourcesNoConnection() { void getCollection() { replay(collection, mgtService, perm, resource, clientFrame, account, group); assertThat(client.getCollection()).isNull(); - client.current = collection; + client.setCollection(collection); assertThat(client.getCollection()).isNotNull(); } @@ -110,7 +134,7 @@ void getProperties() { @Test void getResourcesWithConnection() throws XMLDBException { - client.current = collection; + client.setCollection(collection); recordResourceData(false); clientFrame.setResources(anyObject()); @@ -121,14 +145,14 @@ void getResourcesWithConnection() throws XMLDBException { @Test void getResourcesWithConnectionWithPermissions() throws XMLDBException { - client.current = collection; + client.setCollection(collection); collection.setProperty(PERMISSIONS, "true"); recordResourceData(true); clientFrame.setResources(anyObject()); replay(collection, mgtService, perm, resource, clientFrame, account, group); - client.properties.setProperty(PERMISSIONS, "true"); + client.getProperties().setProperty(PERMISSIONS, "true"); assertThatNoException().isThrownBy(client::getResources); } @@ -185,28 +209,28 @@ void displayHelp() { @Test void readQueryHistory(@TempDir Path tempDir) throws IOException { - client.queryHistoryFile = tempDir.resolve(".exist_query_history"); + client.setQueryHistoryFile(tempDir.resolve(".exist_query_history")); replay(collection, mgtService, perm, resource, clientFrame, account, group); assertThatNoException().isThrownBy(client::readQueryHistory); - assertThat(client.queryHistory).isEmpty(); + assertThat(client.getQueryHistory()).isEmpty(); ArrayList content = new ArrayList<>(); content.add(""); content.add("query one"); content.add("query two"); content.add(""); - Files.write(client.queryHistoryFile, content); + Files.write(client.getQueryHistoryFile(), content); assertThatNoException().isThrownBy(client::readQueryHistory); - assertThat(client.queryHistory).containsExactly("query one", "query two"); + assertThat(client.getQueryHistory()).containsExactly("query one", "query two"); } @Test void writeQueryHistory(@TempDir Path tempDir) throws IOException { Path historyFile = tempDir.resolve(".exist_query_history"); - client.console = LineReaderBuilder.builder().variable(LineReader.HISTORY_FILE, historyFile).build(); - client.queryHistoryFile = historyFile; + client.setConsole(LineReaderBuilder.builder().variable(LineReader.HISTORY_FILE, historyFile).build()); + client.setQueryHistoryFile(historyFile); for (int index = 0; index < 21; index++) { - client.queryHistory.add("query" + index); + client.getQueryHistory().add("query" + index); } replay(collection, mgtService, perm, resource, clientFrame, account, group); @@ -280,7 +304,7 @@ ClientFrame createClientFrame() { @Override protected void connect() throws Exception { - current = collection; + setCollection(collection); } @Override diff --git a/exist-core/src/test/java/org/exist/collections/CollectionRemovalTest.java b/exist-core/src/test/java/org/exist/collections/CollectionRemovalTest.java index 34abca71f7..b7f08047d7 100644 --- a/exist-core/src/test/java/org/exist/collections/CollectionRemovalTest.java +++ b/exist-core/src/test/java/org/exist/collections/CollectionRemovalTest.java @@ -64,6 +64,7 @@ import org.exist.util.DatabaseConfigurationException; import org.exist.util.LockException; import org.exist.util.StringInputSource; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.EXistXPathQueryService; import org.exist.xmldb.XmldbURI; import org.junit.*; @@ -74,7 +75,6 @@ import org.xml.sax.SAXException; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Database; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import xyz.elemental.mediatype.MediaType; @@ -180,17 +180,16 @@ private void retrieveDoc(final XmldbURI uri) throws EXistException, PermissionDe } private void doQuery(final int expected) throws XMLDBException { - final org.xmldb.api.base.Collection testCollection = - DatabaseManager.getCollection("xmldb:exist://" + TestConstants.TEST_COLLECTION_URI.toString(), "admin", ""); - if (testCollection == null) { - return; - } - final EXistXPathQueryService service = testCollection.getService(EXistXPathQueryService.class); - ResourceSet result = service.query(QUERY1); - assertEquals(expected, result.getSize()); + try (final org.xmldb.api.base.Collection testCollection = DatabaseManager.getCollection("xmldb:exist://" + TestConstants.TEST_COLLECTION_URI.toString(), "admin", "")) { + final EXistXPathQueryService service = testCollection.getService(EXistXPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(QUERY1)) { + assertEquals(expected, result.getSize()); + } - result = service.query(QUERY2); - assertEquals(expected, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(QUERY2)) { + assertEquals(expected, result.getSize()); + } + } } @BeforeClass @@ -247,9 +246,10 @@ public void initDB() throws EXistException, PermissionDeniedException, IOExcepti @After public void clearDB() throws XMLDBException { - final org.xmldb.api.base.Collection root = - DatabaseManager.getCollection("xmldb:exist://" + TestConstants.TEST_COLLECTION_URI.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService service = root.getService(CollectionManagementService.class); - service.removeCollection("."); + try (final org.xmldb.api.base.Collection root = + DatabaseManager.getCollection("xmldb:exist://" + TestConstants.TEST_COLLECTION_URI.toString(), TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + service.removeCollection("."); + } } } diff --git a/exist-core/src/test/java/org/exist/collections/ConcurrencyTest.java b/exist-core/src/test/java/org/exist/collections/ConcurrencyTest.java index 03b12c6173..d20922add6 100644 --- a/exist-core/src/test/java/org/exist/collections/ConcurrencyTest.java +++ b/exist-core/src/test/java/org/exist/collections/ConcurrencyTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -122,19 +146,20 @@ private QueryTask(final String query, final int start, final boolean protect) { @Override public void run() { try { - final Collection collection = DatabaseManager.getCollection("xmldb:exist:///db/test", "admin", ""); - final EXistXPathQueryService service = collection.getService(EXistXPathQueryService.class); - if(protect) { - service.beginProtected(); - } - try { - if (start > 0) { - service.declareVariable("start", Integer.valueOf(start)); - } - service.query(query); - } finally { + try (final Collection collection = DatabaseManager.getCollection("xmldb:exist:///db/test", "admin", "")) { + final EXistXPathQueryService service = collection.getService(EXistXPathQueryService.class); if(protect) { - service.endProtected(); + service.beginProtected(); + } + try { + if (start > 0) { + service.declareVariable("start", Integer.valueOf(start)); + } + service.query(query); + } finally { + if(protect) { + service.endProtected(); + } } } } catch (final Exception e) { @@ -150,14 +175,15 @@ public static void initDB() throws XMLDBException { try (final Collection test = mgmt.createCollection("test")) { for (int i = 1; i <= DOC_COUNT; i++) { - final Resource r = test.createResource("test" + i + ".xml", XMLResource.class); - final String XML = + try (final Resource r = test.createResource("test" + i + ".xml", XMLResource.class)) { + final String XML = "" + - " b" + - " d" + - ""; - r.setContent(XML); - test.storeResource(r); + " b" + + " d" + + ""; + r.setContent(XML); + test.storeResource(r); + } } } } diff --git a/exist-core/src/test/java/org/exist/collections/triggers/CollectionTriggerTest.java b/exist-core/src/test/java/org/exist/collections/triggers/CollectionTriggerTest.java index 7694588280..4f6aaaf405 100644 --- a/exist-core/src/test/java/org/exist/collections/triggers/CollectionTriggerTest.java +++ b/exist-core/src/test/java/org/exist/collections/triggers/CollectionTriggerTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -53,23 +77,24 @@ public void move() throws XMLDBException, EXistException, PermissionDeniedExcept //create /db/testCollectionTrigger/srcCollection final EXistCollectionManagementService colMgmtSrv = testCollection.getService(EXistCollectionManagementService.class); - final Collection srcCollection = colMgmtSrv.createCollection("col1"); + try (final Collection srcCollection = colMgmtSrv.createCollection("col1")) { - final XmldbURI baseUri = XmldbURI.create(testCollection.getName()); - final XmldbURI srcUri = XmldbURI.create(srcCollection.getName()); - final XmldbURI newDest = XmldbURI.create("moved"); + final XmldbURI baseUri = XmldbURI.create(testCollection.getName()); + final XmldbURI srcUri = XmldbURI.create(srcCollection.getName()); + final XmldbURI newDest = XmldbURI.create("moved"); - //perform the move - colMgmtSrv.move(srcUri, baseUri, newDest); + //perform the move + colMgmtSrv.move(srcUri, baseUri, newDest); - //get the trigger and check its count - CountingCollectionTrigger.CountingCollectionTriggerState triggerState = CountingCollectionTrigger.CountingCollectionTriggerState.getInstance(); + //get the trigger and check its count + CountingCollectionTrigger.CountingCollectionTriggerState triggerState = CountingCollectionTrigger.CountingCollectionTriggerState.getInstance(); - //trigger move methods should have only been - //invoked once as we only moved one resource - assertEquals(1, triggerState.getBeforeMove()); - assertEquals(1, triggerState.getAfterMove()); + //trigger move methods should have only been + //invoked once as we only moved one resource + assertEquals(1, triggerState.getBeforeMove()); + assertEquals(1, triggerState.getAfterMove()); + } } @Before @@ -84,7 +109,10 @@ public void createTestCollection() throws XMLDBException { @After public void removeTestCollection() throws XMLDBException { - rootSrv.removeCollection(XmldbURI.create(testCollection.getName())); + final XmldbURI testCollectionUri = XmldbURI.create(testCollection.getName()); + testCollection.close(); + testCollection = null; + rootSrv.removeCollection(testCollectionUri); } /** just start the DB and create the test collection */ diff --git a/exist-core/src/test/java/org/exist/collections/triggers/SAXTriggerTest.java b/exist-core/src/test/java/org/exist/collections/triggers/SAXTriggerTest.java index ab2faee3bd..c4c4e34677 100644 --- a/exist-core/src/test/java/org/exist/collections/triggers/SAXTriggerTest.java +++ b/exist-core/src/test/java/org/exist/collections/triggers/SAXTriggerTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -84,17 +108,19 @@ public void test() throws EXistException, XMLDBException { final BrokerPool db = BrokerPool.getInstance(); db.registerDocumentTrigger(AnotherTrigger.class); - final Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", ""); + try (final Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", "")) { - final Resource resource = root.createResource("data.xml", XMLResource.class); - resource.setContent(DOCUMENT1_CONTENT); - root.storeResource(resource); + try (final Resource resource = root.createResource("data.xml", XMLResource.class)) { + resource.setContent(DOCUMENT1_CONTENT); + root.storeResource(resource); + } - assertEquals(3, AnotherTrigger.createDocumentEvents); + assertEquals(3, AnotherTrigger.createDocumentEvents); - assertEquals(26, AnotherTrigger.count); + assertEquals(26, AnotherTrigger.count); - assertEquals(DOCUMENT1_CONTENT, AnotherTrigger.sb.toString()); + assertEquals(DOCUMENT1_CONTENT, AnotherTrigger.sb.toString()); + } } @Test @@ -103,66 +129,78 @@ public void saxEventModifications() throws EXistException, XMLDBException { final BrokerPool db = BrokerPool.getInstance(); db.registerDocumentTrigger(StoreTrigger.class); - final Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", ""); + try (final Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", "")) { - Resource resource = root.createResource("data.xml", XMLResource.class); - resource.setContent(DOCUMENT2_CONTENT); - root.storeResource(resource); + try (final Resource resource = root.createResource("data.xml", XMLResource.class)) { + resource.setContent(DOCUMENT2_CONTENT); + root.storeResource(resource); + } - resource = root.createResource("data.xml", XMLResource.class); - - assertEquals(DOCUMENT3_CONTENT, resource.getContent().toString()); + try (final Resource resource = root.createResource("data.xml", XMLResource.class)) { + assertEquals(DOCUMENT3_CONTENT, resource.getContent().toString()); + } + } } @Test - public void saxEventModificationsAtXConf() throws EXistException, XMLDBException { - final Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", ""); - - final IndexQueryService idxConf = root.getService(IndexQueryService.class); - idxConf.configureCollection(COLLECTION_CONFIG); + public void saxEventModificationsAtXConf() throws XMLDBException { + try (final Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", "")) { - Resource resource = root.createResource("data.xml", XMLResource.class); - resource.setContent(DOCUMENT2_CONTENT); - root.storeResource(resource); + final IndexQueryService idxConf = root.getService(IndexQueryService.class); + idxConf.configureCollection(COLLECTION_CONFIG); - resource = root.createResource("data.xml", XMLResource.class); + try (final Resource resource = root.createResource("data.xml", XMLResource.class)) { + resource.setContent(DOCUMENT2_CONTENT); + root.storeResource(resource); + } - assertEquals(DOCUMENT3_CONTENT, resource.getContent().toString()); + try (final Resource resource = root.createResource("data.xml", XMLResource.class)) { + assertEquals(DOCUMENT3_CONTENT, resource.getContent().toString()); + } + } } @After public void cleanDB() throws XMLDBException { - final Collection config = DatabaseManager.getCollection(BASE_URI + "/db/system/config" + testCollection, "admin", ""); - if (config != null) { - CollectionManagementService mgmt = config.getService(CollectionManagementService.class); - mgmt.removeCollection("."); - } - final Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", ""); - - Resource resource = root.getResource("messages.xml"); - if (resource != null) { - root.removeResource(resource); + try (final Collection config = DatabaseManager.getCollection(BASE_URI + "/db/system/config" + testCollection, "admin", "")) { + if (config != null) { + CollectionManagementService mgmt = config.getService(CollectionManagementService.class); + mgmt.removeCollection("."); + } } - - resource = root.getResource("data.xml"); - if (resource != null) { - root.removeResource(resource); + + try (final Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", "")) { + + try (final Resource resource = root.getResource("messages.xml")) { + if (resource != null) { + root.removeResource(resource); + } + } + + try (final Resource resource = root.getResource("data.xml")) { + if (resource != null) { + root.removeResource(resource); + } + } } } @BeforeClass - public static void initDB() throws ClassNotFoundException, XMLDBException, InstantiationException, IllegalAccessException { + public static void initDB() throws XMLDBException { CollectionManagementService mgmt = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - Collection testCol = mgmt.createCollection("triggers"); - - for (int i = 1; i <= 2; i++) { + try (final Collection testCol = mgmt.createCollection("triggers")) { mgmt = testCol.getService(CollectionManagementService.class); - testCol = mgmt.createCollection("sub" + i); + try (final Collection sub1 = mgmt.createCollection("sub1")) { + mgmt = sub1.getService(CollectionManagementService.class); + try (final Collection sub2 = mgmt.createCollection("sub2")) { + // needed to ensure that sub2 is closed + } + } } } @AfterClass - public static void closeDB() throws XMLDBException, LockException, TriggerException, PermissionDeniedException, EXistException, IOException { + public static void closeDB() throws LockException, TriggerException, PermissionDeniedException, EXistException, IOException { TestUtils.cleanupDB(); } } diff --git a/exist-core/src/test/java/org/exist/collections/triggers/TriggerConfigTest.java b/exist-core/src/test/java/org/exist/collections/triggers/TriggerConfigTest.java index f2e698e2ad..64b1e12a8f 100644 --- a/exist-core/src/test/java/org/exist/collections/triggers/TriggerConfigTest.java +++ b/exist-core/src/test/java/org/exist/collections/triggers/TriggerConfigTest.java @@ -50,6 +50,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.IndexQueryService; import org.junit.*; @@ -60,7 +61,9 @@ import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XQueryService; @@ -117,98 +120,124 @@ public static java.util.Collection data() { @BeforeClass public static void initDB() throws XMLDBException { CollectionManagementService mgmt = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - Collection testCol = mgmt.createCollection("triggers"); - - for (int i = 1; i <= 2; i++) { + try (final Collection testCol = mgmt.createCollection("triggers")) { mgmt = testCol.getService(CollectionManagementService.class); - testCol = mgmt.createCollection("sub" + i); + try (final Collection sub1 = mgmt.createCollection("sub1")) { + mgmt = sub1.getService(CollectionManagementService.class); + try (final Collection sub2 = mgmt.createCollection("sub2")) { + } + } } } @After public void cleanDB() throws XMLDBException { - Collection config = DatabaseManager.getCollection(BASE_URI + "/db/system/config" + testCollection, "admin", ""); - if (config != null) { - CollectionManagementService mgmt = config.getService(CollectionManagementService.class); - mgmt.removeCollection("."); - } - Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", ""); - Resource resource = root.getResource("messages.xml"); - if (resource != null) { - root.removeResource(resource); + try (Collection config = DatabaseManager.getCollection(BASE_URI + "/db/system/config" + testCollection, "admin", "")) { + if (config != null) { + CollectionManagementService mgmt = config.getService(CollectionManagementService.class); + mgmt.removeCollection("."); + } } - resource = root.getResource("data.xml"); - if (resource != null) { - root.removeResource(resource); + + try (final Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", ""); + final Resource messages = root.getResource("messages.xml")) { + if (messages != null) { + root.removeResource(messages); + } + + try (final Resource data = root.getResource("data.xml")) { + if (data != null) { + root.removeResource(data); + } + } } } @Test public void storeDocument() throws XMLDBException { - Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", ""); - IndexQueryService iqs = root.getService(IndexQueryService.class); - iqs.configureCollection(COLLECTION_CONFIG); - - Resource resource = root.createResource("data.xml", XMLResource.class); - resource.setContent(DOCUMENT_CONTENT); - root.storeResource(resource); - XQueryService qs = root.getService(XQueryService.class); - ResourceSet result = qs.queryResource("messages.xml", "string(//event[last()]/@collection)"); - assertEquals(1, result.getSize()); - assertEquals(testCollection, result.getResource(0).getContent()); + try (final Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", "")) { + IndexQueryService iqs = root.getService(IndexQueryService.class); + iqs.configureCollection(COLLECTION_CONFIG); + + try (final Resource resource = root.createResource("data.xml", XMLResource.class)) { + resource.setContent(DOCUMENT_CONTENT); + root.storeResource(resource); + XQueryService qs = root.getService(XQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) qs.queryResource("messages.xml", "string(//event[last()]/@collection)")) { + assertEquals(1, result.getSize()); + try (final Resource eventResource = result.getResource(0)) { + assertEquals(testCollection, eventResource.getContent()); + } + } + } + } } @Test public void removeDocument() throws XMLDBException { - Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", ""); - IndexQueryService iqs = root.getService(IndexQueryService.class); - iqs.configureCollection(COLLECTION_CONFIG); - - Resource resource = root.createResource("data.xml", XMLResource.class); - resource.setContent(DOCUMENT_CONTENT); - root.storeResource(resource); - - root.removeResource(resource); - - XQueryService qs = root.getService(XQueryService.class); - ResourceSet result = qs.queryResource("messages.xml", "string(//event[last()]/@collection)"); - assertEquals(1, result.getSize()); - assertEquals(testCollection, result.getResource(0).getContent()); + try (final Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", "")) { + IndexQueryService iqs = root.getService(IndexQueryService.class); + iqs.configureCollection(COLLECTION_CONFIG); + + try (final Resource resource = root.createResource("data.xml", XMLResource.class)) { + resource.setContent(DOCUMENT_CONTENT); + root.storeResource(resource); + + root.removeResource(resource); + + XQueryService qs = root.getService(XQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) qs.queryResource("messages.xml", "string(//event[last()]/@collection)")) { + assertEquals(1, result.getSize()); + try (final Resource eventResource = result.getResource(0)) { + assertEquals(testCollection, eventResource.getContent()); + } + } + } + } } @Test public void removeTriggers() throws XMLDBException { - Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", ""); - IndexQueryService iqs = root.getService(IndexQueryService.class); - iqs.configureCollection(EMPTY_COLLECTION_CONFIG); - - Resource resource = root.createResource("data.xml", XMLResource.class); - resource.setContent(DOCUMENT_CONTENT); - root.storeResource(resource); - - XQueryService qs = root.getService(XQueryService.class); - ResourceSet result = qs.query("if (doc-available('" + testCollection + "/messages.xml')) then doc('" + testCollection + "/messages.xml')/events/event[@id = 'STORE-DOCUMENT'] else ()"); - assertEquals("No trigger should have fired. Configuration was removed", 0, result.getSize()); + try (final Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", "")) { + IndexQueryService iqs = root.getService(IndexQueryService.class); + iqs.configureCollection(EMPTY_COLLECTION_CONFIG); + + try (final Resource resource = root.createResource("data.xml", XMLResource.class)) { + resource.setContent(DOCUMENT_CONTENT); + root.storeResource(resource); + + XQueryService qs = root.getService(XQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) qs.query("if (doc-available('" + testCollection + "/messages.xml')) then doc('" + testCollection + "/messages.xml')/events/event[@id = 'STORE-DOCUMENT'] else ()")) { + assertEquals("No trigger should have fired. Configuration was removed", 0, result.getSize()); + } + } + } } @Test public void updateTriggers() throws XMLDBException { - Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", ""); - IndexQueryService iqs = root.getService(IndexQueryService.class); - iqs.configureCollection(EMPTY_COLLECTION_CONFIG); - - Collection configCol = DatabaseManager.getCollection(BASE_URI + "/db/system/config" + testCollection, "admin", ""); - Resource resource = configCol.createResource(DEFAULT_COLLECTION_CONFIG_FILE, XMLResource.class); - resource.setContent(COLLECTION_CONFIG); - configCol.storeResource(resource); - - resource = root.createResource("data.xml", XMLResource.class); - resource.setContent(DOCUMENT_CONTENT); - root.storeResource(resource); - - XQueryService qs = root.getService(XQueryService.class); - ResourceSet result = qs.query("if (doc-available('" + testCollection + "/messages.xml')) then doc('" + testCollection + "/messages.xml')/events/event[@id = 'STORE-DOCUMENT']/string(@collection) else ()"); - assertEquals(1, result.getSize()); - assertEquals(testCollection, result.getResource(0).getContent()); + try (final Collection root = DatabaseManager.getCollection(BASE_URI + testCollection, "admin", "")) { + IndexQueryService iqs = root.getService(IndexQueryService.class); + iqs.configureCollection(EMPTY_COLLECTION_CONFIG); + + try (final Collection configCol = DatabaseManager.getCollection(BASE_URI + "/db/system/config" + testCollection, "admin", ""); + final Resource resource = configCol.createResource(DEFAULT_COLLECTION_CONFIG_FILE, XMLResource.class)) { + resource.setContent(COLLECTION_CONFIG); + configCol.storeResource(resource); + } + + try (final Resource resource = root.createResource("data.xml", XMLResource.class)) { + resource.setContent(DOCUMENT_CONTENT); + root.storeResource(resource); + } + + XQueryService qs = root.getService(XQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) qs.query("if (doc-available('" + testCollection + "/messages.xml')) then doc('" + testCollection + "/messages.xml')/events/event[@id = 'STORE-DOCUMENT']/string(@collection) else ()")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(testCollection, resource.getContent()); + } + } + } } } \ No newline at end of file diff --git a/exist-core/src/test/java/org/exist/collections/triggers/XQueryTrigger2Test.java b/exist-core/src/test/java/org/exist/collections/triggers/XQueryTrigger2Test.java index 608fd249fd..8fa10941ee 100644 --- a/exist-core/src/test/java/org/exist/collections/triggers/XQueryTrigger2Test.java +++ b/exist-core/src/test/java/org/exist/collections/triggers/XQueryTrigger2Test.java @@ -48,17 +48,13 @@ import org.apache.commons.codec.binary.Base64; import org.exist.TestUtils; import org.exist.test.ExistXmldbEmbeddedServer; -import org.exist.xmldb.EXistCollectionManagementService; -import org.exist.xmldb.EXistResource; -import org.exist.xmldb.IndexQueryService; -import org.exist.xmldb.XmldbURI; +import org.exist.xmldb.*; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.*; import xyz.elemental.mediatype.MediaType; @@ -276,24 +272,34 @@ public void setup() throws XMLDBException { triggeredCollection = service.createCollection(TRIGGERED_COLLECTION); assertNotNull(triggeredCollection); - final XMLResource doc = (XMLResource) eventsCollection.createResource(LOG_NAME, XMLResource.class); - doc.setContent(EMPTY_LOG); - eventsCollection.storeResource(doc); + try (final XMLResource doc = (XMLResource) eventsCollection.createResource(LOG_NAME, XMLResource.class)) { + doc.setContent(EMPTY_LOG); + eventsCollection.storeResource(doc); + } - final BinaryResource module = testCollection.createResource(MODULE_NAME, BinaryResource.class); - ((EXistResource)module).setMediaType(MediaType.APPLICATION_XQUERY); - module.setContent(MODULE.getBytes()); - testCollection.storeResource(module); + try (final BinaryResource module = testCollection.createResource(MODULE_NAME, BinaryResource.class)) { + ((EXistResource)module).setMediaType(MediaType.APPLICATION_XQUERY); + module.setContent(MODULE.getBytes()); + testCollection.storeResource(module); + } } @After public void cleanup() throws XMLDBException { + if (triggeredCollection != null) { + triggeredCollection.close(); + triggeredCollection = null; + } + if (eventsCollection != null) { + eventsCollection.close(); + eventsCollection = null; + } + if (testCollection != null) { + testCollection.close(); + testCollection = null; + } final CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); service.removeCollection(TEST_COLLECTION); - - testCollection = null; - eventsCollection = null; - triggeredCollection = null; } /** test a trigger fired by storing a new Document */ @@ -304,23 +310,28 @@ public void documentCreate() throws XMLDBException { idxConf.configureCollection(COLLECTION_CONFIG); // this will fire the trigger - final XMLResource doc = triggeredCollection.createResource(DOCUMENT_NAME, XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - triggeredCollection.storeResource(doc); + try (final XMLResource doc = triggeredCollection.createResource(DOCUMENT_NAME, XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + triggeredCollection.storeResource(doc); + } // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); final XPathQueryService service = eventsCollection.getService(XPathQueryService.class); - ResourceSet result = service.query(BEFORE+CREATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+CREATE+DOCUMENT+documentURI)) + { + assertEquals(1, result.getSize()); + } - result = service.query(AFTER+CREATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+CREATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(EVENTS); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(EVENTS)) { + assertEquals(2, result.getSize()); + } } /** test a trigger fired by a Document Update */ @@ -329,9 +340,10 @@ public void documentUpdate() throws XMLDBException { final IndexQueryService idxConf = triggeredCollection.getService(IndexQueryService.class); idxConf.configureCollection(COLLECTION_CONFIG); - final XMLResource doc = triggeredCollection.createResource(DOCUMENT_NAME, XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - triggeredCollection.storeResource(doc); + try (final XMLResource doc = triggeredCollection.createResource(DOCUMENT_NAME, XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + triggeredCollection.storeResource(doc); + } //TODO : trigger UPDATE events ! final XUpdateQueryService update = triggeredCollection.getService(XUpdateQueryService.class); @@ -344,20 +356,25 @@ public void documentUpdate() throws XMLDBException { // this is necessary to compare with MODIFIED_DOCUMENT_CONTENT ; TODO better compare with XML diff tool service.setProperty(OutputKeys.INDENT, "no"); - ResourceSet result = service.query(BEFORE+CREATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+CREATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(AFTER+CREATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+CREATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(BEFORE+UPDATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+UPDATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(AFTER+UPDATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+UPDATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(EVENTS); - assertEquals(4, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(EVENTS)) { + assertEquals(4, result.getSize()); + } } /** test a trigger fired by a Document Delete */ @@ -366,11 +383,16 @@ public void documentDelete() throws XMLDBException { final IndexQueryService idxConf = triggeredCollection.getService(IndexQueryService.class); idxConf.configureCollection(COLLECTION_CONFIG); - final XMLResource doc = triggeredCollection.createResource(DOCUMENT_NAME, XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - triggeredCollection.storeResource(doc); + try (final XMLResource doc = triggeredCollection.createResource(DOCUMENT_NAME, XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + triggeredCollection.storeResource(doc); + } - triggeredCollection.removeResource(triggeredCollection.getResource(DOCUMENT_NAME)); + try (final Resource res = triggeredCollection.getResource(DOCUMENT_NAME)) { + if (res != null) { + triggeredCollection.removeResource(res); + } + } // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); @@ -379,20 +401,25 @@ public void documentDelete() throws XMLDBException { service.setProperty(OutputKeys.INDENT, "no"); - ResourceSet result = service.query(BEFORE+CREATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+CREATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(AFTER+CREATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+CREATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(BEFORE+DELETE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+DELETE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(AFTER+DELETE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+DELETE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(EVENTS); - assertEquals(4, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(EVENTS)) { + assertEquals(4, result.getSize()); + } } /** test a trigger fired by creating a new Binary Document */ @@ -403,10 +430,11 @@ public void documentBinaryCreate() throws XMLDBException { idxConf.configureCollection(COLLECTION_CONFIG); // this will fire the trigger - final Resource res = triggeredCollection.createResource(BINARY_DOCUMENT_NAME, BinaryResource.class); - final byte[] content = Base64.decodeBase64(BINARY_DOCUMENT_CONTENT); - res.setContent(content); - triggeredCollection.storeResource(res); + try (final Resource res = triggeredCollection.createResource(BINARY_DOCUMENT_NAME, BinaryResource.class)) { + final byte[] content = Base64.decodeBase64(BINARY_DOCUMENT_CONTENT); + res.setContent(content); + triggeredCollection.storeResource(res); + } // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); @@ -415,14 +443,17 @@ public void documentBinaryCreate() throws XMLDBException { //TODO : understand why it is necessary ! service.setProperty(OutputKeys.INDENT, "no"); - ResourceSet result = service.query(BEFORE+CREATE+DOCUMENT+binaryURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+CREATE+DOCUMENT+binaryURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(AFTER+CREATE+DOCUMENT+binaryURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+CREATE+DOCUMENT+binaryURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(EVENTS); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(EVENTS)) { + assertEquals(2, result.getSize()); + } } /** test a trigger fired by a Binary Document Delete */ @@ -432,12 +463,17 @@ public void documentBinaryDelete() throws XMLDBException { idxConf.configureCollection(COLLECTION_CONFIG); // this will fire the trigger - final Resource res = triggeredCollection.createResource(BINARY_DOCUMENT_NAME, BinaryResource.class); - final byte[] content = Base64.decodeBase64(BINARY_DOCUMENT_CONTENT); - res.setContent(content); - triggeredCollection.storeResource(res); + try (final Resource res = triggeredCollection.createResource(BINARY_DOCUMENT_NAME, BinaryResource.class)) { + final byte[] content = Base64.decodeBase64(BINARY_DOCUMENT_CONTENT); + res.setContent(content); + triggeredCollection.storeResource(res); + } - triggeredCollection.removeResource(triggeredCollection.getResource(BINARY_DOCUMENT_NAME)); + try (final Resource res = triggeredCollection.getResource(BINARY_DOCUMENT_NAME)) { + if (res != null) { + triggeredCollection.removeResource(res); + } + } // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); @@ -446,21 +482,25 @@ public void documentBinaryDelete() throws XMLDBException { service.setProperty(OutputKeys.INDENT, "no"); - ResourceSet result = service.query(BEFORE+CREATE+DOCUMENT+binaryURI); - assertEquals(1, result.getSize()); - - result = service.query(AFTER+CREATE+DOCUMENT+binaryURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+CREATE+DOCUMENT+binaryURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(BEFORE+DELETE+DOCUMENT+binaryURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+CREATE+DOCUMENT+binaryURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(AFTER+DELETE+DOCUMENT+binaryURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+DELETE+DOCUMENT+binaryURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(EVENTS); - assertEquals(4, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+DELETE+DOCUMENT+binaryURI)) { + assertEquals(1, result.getSize()); + } + try (final EXistResourceSet result = (EXistResourceSet) service.query(EVENTS)) { + assertEquals(4, result.getSize()); + } } /** test a trigger fired by a Collection manipulations */ @@ -470,22 +510,26 @@ public void collectionCreate() throws XMLDBException { idxConf.configureCollection(COLLECTION_CONFIG); final CollectionManagementService service = triggeredCollection.getService(CollectionManagementService.class); - final Collection collection = service.createCollection("test"); - assertNotNull(collection); + try (final Collection collection = service.createCollection("test")) { + assertNotNull(collection); - // remove the trigger for the Collection under test - idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); + // remove the trigger for the Collection under test + idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); - final XPathQueryService query = eventsCollection.getService(XPathQueryService.class); + final XPathQueryService query = eventsCollection.getService(XPathQueryService.class); - ResourceSet result = query.query(BEFORE+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) query.query(BEFORE+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = query.query(AFTER+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) query.query(AFTER+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = query.query(EVENTS); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) query.query(EVENTS)) { + assertEquals(2, result.getSize()); + } + } } /** test a trigger fired by a Collection manipulations */ @@ -498,37 +542,44 @@ public void collectionCopy() throws XMLDBException, URISyntaxException { final XmldbURI dstURI = XmldbURI.xmldbUriFor("/db/testXQueryTrigger/triggered/test-dst"); final EXistCollectionManagementService service = triggeredCollection.getService(EXistCollectionManagementService.class); - final Collection src = service.createCollection("test"); - assertNotNull(src); - - final Collection dst = service.createCollection("test-dst"); - assertNotNull(dst); + try (final Collection src = service.createCollection("test"); + final Collection dst = service.createCollection("test-dst")) { + assertNotNull(src); + assertNotNull(dst); + } service.copy(srcURI, dstURI, null); // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); - ResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testDstCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testDstCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testDstCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testDstCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(BEFORE+COPY+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+COPY+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(AFTER+COPY+COLLECTION+testDstTestCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+COPY+COLLECTION+testDstTestCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(EVENTS); - assertEquals(6, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(EVENTS)) { + assertEquals(6, result.getSize()); + } } /** test a trigger fired by a Collection manipulations */ @@ -541,37 +592,44 @@ public void collectionMove() throws XMLDBException, URISyntaxException { final XmldbURI dstURI = XmldbURI.xmldbUriFor("/db/testXQueryTrigger/triggered/test-dst"); final EXistCollectionManagementService service = triggeredCollection.getService(EXistCollectionManagementService.class); - final Collection src = service.createCollection("test"); - assertNotNull(src); - - final Collection dst = service.createCollection("test-dst"); - assertNotNull(dst); + try (final Collection src = service.createCollection("test"); + final Collection dst = service.createCollection("test-dst")) { + assertNotNull(src); + assertNotNull(dst); + } service.move(srcURI, dstURI, null); // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); - ResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testDstCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testDstCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testDstCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testDstCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(BEFORE+MOVE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+MOVE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(AFTER+MOVE+COLLECTION+testDstTestCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+MOVE+COLLECTION+testDstTestCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(EVENTS); - assertEquals(6, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(EVENTS)) { + assertEquals(6, result.getSize()); + } } /** test a trigger fired by a Collection manipulations */ @@ -581,36 +639,43 @@ public void collectionDelete() throws XMLDBException { idxConf.configureCollection(COLLECTION_CONFIG); final CollectionManagementService service = triggeredCollection.getService(CollectionManagementService.class); - final Collection collection = service.createCollection("test"); - assertNotNull(collection); + try (final Collection collection = service.createCollection("test")) { + assertNotNull(collection); + } service.removeCollection("test"); // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); - ResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(BEFORE+DELETE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+DELETE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(AFTER+DELETE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+DELETE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } - result = existEmbeddedServer.executeQuery(EVENTS); - assertEquals(4, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(EVENTS)) { + assertEquals(4, result.getSize()); + } } @Test public void storeDocumentInvalidTriggerForPrepare() throws XMLDBException { - final BinaryResource invalidModule = testCollection.createResource(MODULE_NAME, BinaryResource.class); - ((EXistResource)invalidModule).setMediaType(MediaType.APPLICATION_XQUERY); - invalidModule.setContent(INVALID_MODULE.getBytes()); - testCollection.storeResource(invalidModule); + try (final BinaryResource invalidModule = testCollection.createResource(MODULE_NAME, BinaryResource.class)) { + ((EXistResource)invalidModule).setMediaType(MediaType.APPLICATION_XQUERY); + invalidModule.setContent(INVALID_MODULE.getBytes()); + testCollection.storeResource(invalidModule); + } // configure the Collection with the trigger under test final IndexQueryService idxConf = triggeredCollection.getService(IndexQueryService.class); @@ -621,9 +686,10 @@ public void storeDocumentInvalidTriggerForPrepare() throws XMLDBException { for(int i = 0; i < max_store_attempts; i++) { try { // this will fire the trigger - final XMLResource doc = triggeredCollection.createResource(DOCUMENT_NAME, XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - triggeredCollection.storeResource(doc); + try (final XMLResource doc = triggeredCollection.createResource(DOCUMENT_NAME, XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + triggeredCollection.storeResource(doc); + } } catch(XMLDBException xdbe) { if (xdbe.getCause() instanceof TriggerException && xdbe.getCause().getMessage().equals(XQueryTrigger.PREPARE_EXCEPTION_MESSAGE)) { count_prepare_exceptions++; diff --git a/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerTest.java b/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerTest.java index d165942841..500aafff8e 100644 --- a/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerTest.java +++ b/exist-core/src/test/java/org/exist/collections/triggers/XQueryTriggerTest.java @@ -55,14 +55,10 @@ import org.apache.commons.codec.binary.Base64; import org.exist.TestUtils; import org.exist.test.ExistXmldbEmbeddedServer; -import org.exist.xmldb.EXistCollectionManagementService; -import org.exist.xmldb.EXistResource; -import org.exist.xmldb.IndexQueryService; -import org.exist.xmldb.XmldbURI; +import org.exist.xmldb.*; import org.junit.*; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; @@ -276,23 +272,27 @@ public void setup() throws XMLDBException { testCollection = service.createCollection(TEST_COLLECTION); assertNotNull(testCollection); - final XMLResource doc = testCollection.createResource(LOG_NAME, XMLResource.class ); - doc.setContent(EMPTY_LOG); - testCollection.storeResource(doc); + try (final XMLResource doc = testCollection.createResource(LOG_NAME, XMLResource.class )) { + doc.setContent(EMPTY_LOG); + testCollection.storeResource(doc); + } - final BinaryResource module = testCollection.createResource(MODULE_NAME, BinaryResource.class ); - ((EXistResource)module).setMediaType(MediaType.APPLICATION_XQUERY); - module.setContent(MODULE.getBytes()); - testCollection.storeResource(module); + try (final BinaryResource module = testCollection.createResource(MODULE_NAME, BinaryResource.class )) { + ((EXistResource)module).setMediaType(MediaType.APPLICATION_XQUERY); + module.setContent(MODULE.getBytes()); + testCollection.storeResource(module); + } } @After public void cleanup() throws XMLDBException { + if (testCollection != null) { + testCollection.close(); + testCollection = null; + } final CollectionManagementService service = existEmbeddedServer.getRoot() .getService(CollectionManagementService.class); service.removeCollection(TEST_COLLECTION); - - testCollection = null; } /** test a trigger fired by storing a new Document */ @@ -303,32 +303,36 @@ public void documentCreate() throws XMLDBException { idxConf.configureCollection(COLLECTION_CONFIG); // this will fire the trigger - final XMLResource doc = testCollection.createResource(DOCUMENT_NAME, XMLResource.class ); - doc.setContent(DOCUMENT_CONTENT); - testCollection.storeResource(doc); + try (final XMLResource doc = testCollection.createResource(DOCUMENT_NAME, XMLResource.class )) { + doc.setContent(DOCUMENT_CONTENT); + testCollection.storeResource(doc); + } // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); final XPathQueryService service = testCollection.getService(XPathQueryService.class); - ResourceSet result = service.query(BEFORE+CREATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); - - result = service.query(AFTER+CREATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); - - result = service.query(EVENTS); - // TODO(AR) should be 6 results see: https://github.com/eXist-db/exist/issues/4279 - // results should contain: - // BEFORE CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - //assertEquals(6, result.getSize()); - assertEquals(4, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+CREATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+CREATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(EVENTS)) { + // TODO(AR) should be 6 results see: https://github.com/eXist-db/exist/issues/4279 + // results should contain: + // BEFORE CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + //assertEquals(6, result.getSize()); + assertEquals(4, result.getSize()); + } } /** test a trigger fired by a Document Update */ @@ -337,9 +341,10 @@ public void documentUpdate() throws XMLDBException { final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); idxConf.configureCollection(COLLECTION_CONFIG); - final XMLResource doc = testCollection.createResource(DOCUMENT_NAME, XMLResource.class ); - doc.setContent(DOCUMENT_CONTENT); - testCollection.storeResource(doc); + try (final XMLResource doc = testCollection.createResource(DOCUMENT_NAME, XMLResource.class )) { + doc.setContent(DOCUMENT_CONTENT); + testCollection.storeResource(doc); + } //TODO : trigger UPDATE events ! final XUpdateQueryService update = testCollection.getService(XUpdateQueryService.class); @@ -352,35 +357,40 @@ public void documentUpdate() throws XMLDBException { // this is necessary to compare with MODIFIED_DOCUMENT_CONTENT ; TODO better compare with XML diff tool service.setProperty(OutputKeys.INDENT, "no"); - ResourceSet result = service.query(BEFORE+CREATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); - - result = service.query(AFTER+CREATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); - - result = service.query(BEFORE+UPDATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); - - result = service.query(AFTER+UPDATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); - - result = service.query(EVENTS); - // TODO(AR) should be 12 results see: https://github.com/eXist-db/exist/issues/4279 - // results should contain: - // BEFORE CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - //assertEquals(12, result.getSize()); - assertEquals(8, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+CREATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+CREATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+UPDATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+UPDATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(EVENTS)) { + // TODO(AR) should be 12 results see: https://github.com/eXist-db/exist/issues/4279 + // results should contain: + // BEFORE CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + //assertEquals(12, result.getSize()); + assertEquals(8, result.getSize()); + } } /** test a trigger fired by a Document Delete */ @@ -389,11 +399,16 @@ public void documentDelete() throws XMLDBException { final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); idxConf.configureCollection(COLLECTION_CONFIG); - final XMLResource doc = testCollection.createResource(DOCUMENT_NAME, XMLResource.class ); + try (final XMLResource doc = testCollection.createResource(DOCUMENT_NAME, XMLResource.class )) { doc.setContent(DOCUMENT_CONTENT); - testCollection.storeResource(doc); + testCollection.storeResource(doc); + } - testCollection.removeResource(testCollection.getResource(DOCUMENT_NAME)); + try (final Resource res = testCollection.getResource(DOCUMENT_NAME)) { + if (res != null) { + testCollection.removeResource(res); + } + } // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); @@ -402,36 +417,41 @@ public void documentDelete() throws XMLDBException { service.setProperty(OutputKeys.INDENT, "no"); - ResourceSet result = service.query(BEFORE+CREATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); - - result = service.query(AFTER+CREATE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); - - result = service.query(BEFORE+DELETE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); - - result = service.query(AFTER+DELETE+DOCUMENT+documentURI); - assertEquals(1, result.getSize()); - - result = service.query(EVENTS); - - // TODO(AR) should be 12 results see: https://github.com/eXist-db/exist/issues/4279 - // results should contain: - // BEFORE CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // BEFORE DELETE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER DELETE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+CREATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+CREATE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+DELETE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+DELETE+DOCUMENT+documentURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(EVENTS)) { + + // TODO(AR) should be 12 results see: https://github.com/eXist-db/exist/issues/4279 + // results should contain: + // BEFORE CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // BEFORE DELETE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER DELETE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger // assertEquals(12, result.getSize()); - assertEquals(8, result.getSize()); + assertEquals(8, result.getSize()); + } } /** test a trigger fired by creating a new Binary Document */ @@ -442,10 +462,11 @@ public void documentBinaryCreate() throws XMLDBException { idxConf.configureCollection(COLLECTION_CONFIG); // this will fire the trigger - final Resource res = testCollection.createResource(BINARY_DOCUMENT_NAME, BinaryResource.class); - final byte[] content = Base64.decodeBase64(BINARY_DOCUMENT_CONTENT); - res.setContent(content); - testCollection.storeResource(res); + try (final Resource res = testCollection.createResource(BINARY_DOCUMENT_NAME, BinaryResource.class)) { + final byte[] content = Base64.decodeBase64(BINARY_DOCUMENT_CONTENT); + res.setContent(content); + testCollection.storeResource(res); + } // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); @@ -454,23 +475,26 @@ public void documentBinaryCreate() throws XMLDBException { //TODO : understand why it is necessary ! service.setProperty(OutputKeys.INDENT, "no"); - ResourceSet result = service.query(BEFORE+CREATE+DOCUMENT+binaryURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+CREATE+DOCUMENT+binaryURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(AFTER+CREATE+DOCUMENT+binaryURI); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+CREATE+DOCUMENT+binaryURI)) { + assertEquals(1, result.getSize()); + } - result = service.query(EVENTS); - // TODO(AR) should be 6 results see: https://github.com/eXist-db/exist/issues/4279 - // results should contain: - // BEFORE CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - //assertEquals(6, result.getSize()); - assertEquals(4, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(EVENTS)) { + // TODO(AR) should be 6 results see: https://github.com/eXist-db/exist/issues/4279 + // results should contain: + // BEFORE CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + //assertEquals(6, result.getSize()); + assertEquals(4, result.getSize()); + } } @@ -481,13 +505,17 @@ public void documentBinaryDelete() throws XMLDBException { idxConf.configureCollection(COLLECTION_CONFIG); // this will fire the trigger - final Resource res = testCollection.createResource(BINARY_DOCUMENT_NAME, BinaryResource.class); - final byte[] content = Base64.decodeBase64(BINARY_DOCUMENT_CONTENT); - res.setContent(content); - - testCollection.storeResource(res); + try (final Resource res = testCollection.createResource(BINARY_DOCUMENT_NAME, BinaryResource.class)) { + final byte[] content = Base64.decodeBase64(BINARY_DOCUMENT_CONTENT); + res.setContent(content); + testCollection.storeResource(res); + } - testCollection.removeResource(testCollection.getResource(BINARY_DOCUMENT_NAME)); + try (final Resource res = testCollection.getResource(BINARY_DOCUMENT_NAME)) { + if (res != null) { + testCollection.removeResource(res); + } + } // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); @@ -496,35 +524,40 @@ public void documentBinaryDelete() throws XMLDBException { service.setProperty(OutputKeys.INDENT, "no"); - ResourceSet result = service.query(BEFORE+CREATE+DOCUMENT+binaryURI); - assertEquals(1, result.getSize()); - - result = service.query(AFTER+CREATE+DOCUMENT+binaryURI); - assertEquals(1, result.getSize()); - - result = service.query(BEFORE+DELETE+DOCUMENT+binaryURI); - assertEquals(1, result.getSize()); - - result = service.query(AFTER+DELETE+DOCUMENT+binaryURI); - assertEquals(1, result.getSize()); - - result = service.query(EVENTS); - // TODO(AR) should be 12 results see: https://github.com/eXist-db/exist/issues/4279 - // results should contain: - // BEFORE CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // BEFORE DELETE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER DELETE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+CREATE+DOCUMENT+binaryURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+CREATE+DOCUMENT+binaryURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(BEFORE+DELETE+DOCUMENT+binaryURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(AFTER+DELETE+DOCUMENT+binaryURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query(EVENTS)) { + // TODO(AR) should be 12 results see: https://github.com/eXist-db/exist/issues/4279 + // results should contain: + // BEFORE CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER CREATE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // BEFORE DELETE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER DELETE_DOCUMENT(/db/testXQueryTrigger/test.xml): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger // assertEquals(12, result.getSize()); - assertEquals(8, result.getSize()); + assertEquals(8, result.getSize()); + } } @@ -535,31 +568,35 @@ public void collectionCreate() throws XMLDBException { idxConf.configureCollection(COLLECTION_CONFIG); final CollectionManagementService service = testCollection.getService(CollectionManagementService.class); - final Collection collection = service.createCollection("test"); - assertNotNull(collection); + try (final Collection collection = service.createCollection("test")) { + assertNotNull(collection); + } // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); final XPathQueryService query = existEmbeddedServer.getRoot().getService(XPathQueryService.class); - ResourceSet result = query.query(BEFORE+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); - - result = query.query(AFTER+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); - - result = query.query(EVENTS); - // TODO(AR) should be 6 results see: https://github.com/eXist-db/exist/issues/4279 - // results should contain: - // BEFORE CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - //assertEquals(6, result.getSize()); - assertEquals(4, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) query.query(BEFORE+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) query.query(AFTER+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) query.query(EVENTS)) { + // TODO(AR) should be 6 results see: https://github.com/eXist-db/exist/issues/4279 + // results should contain: + // BEFORE CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + //assertEquals(6, result.getSize()); + assertEquals(4, result.getSize()); + } } /** test a trigger fired by a Collection manipulations */ @@ -572,58 +609,66 @@ public void collectionCopy() throws XMLDBException, URISyntaxException { final XmldbURI dstURI = XmldbURI.xmldbUriFor("/db/testXQueryTrigger/test-dst"); final EXistCollectionManagementService service = testCollection.getService(EXistCollectionManagementService.class); - final Collection src = service.createCollection("test"); - assertNotNull(src); + try (final Collection src = service.createCollection("test"); + final Collection dst = service.createCollection("test-dst")) { + assertNotNull(src); - final Collection dst = service.createCollection("test-dst"); - assertNotNull(dst); + assertNotNull(dst); + } service.copy(srcURI, dstURI, null); // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); - ResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testDstCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testDstCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(BEFORE+COPY+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(AFTER+COPY+COLLECTION+testDstTestCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(EVENTS); - // TODO(AR) should be 18 results see: https://github.com/eXist-db/exist/issues/4279 - // results should contain: - // Execute: BEFORE CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // Execute: BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // Execute: AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // Execute: AFTER CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // Execute: BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // Execute: AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // Execute: BEFORE CREATE_COLLECTION(/db/testXQueryTrigger/test-dst): XQueryTrigger - // Execute: BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // Execute: AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // Execute: AFTER CREATE_COLLECTION(/db/testXQueryTrigger/test-dst): XQueryTrigger - // Execute: BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // Execute: AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // Execute: BEFORE COPY_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // Execute: BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // Execute: AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // Execute: AFTER COPY_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // Execute: BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // Execute: AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testDstCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testDstCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+COPY+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+COPY+COLLECTION+testDstTestCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(EVENTS)) { + // TODO(AR) should be 18 results see: https://github.com/eXist-db/exist/issues/4279 + // results should contain: + // Execute: BEFORE CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // Execute: BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // Execute: AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // Execute: AFTER CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // Execute: BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // Execute: AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // Execute: BEFORE CREATE_COLLECTION(/db/testXQueryTrigger/test-dst): XQueryTrigger + // Execute: BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // Execute: AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // Execute: AFTER CREATE_COLLECTION(/db/testXQueryTrigger/test-dst): XQueryTrigger + // Execute: BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // Execute: AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // Execute: BEFORE COPY_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // Execute: BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // Execute: AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // Execute: AFTER COPY_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // Execute: BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // Execute: AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger // assertEquals(18, result.getSize()); - assertEquals(12, result.getSize()); + assertEquals(12, result.getSize()); + } } /** test a trigger fired by a Collection manipulations */ @@ -636,58 +681,66 @@ public void collectionMove() throws XMLDBException, URISyntaxException { final XmldbURI dstURI = XmldbURI.xmldbUriFor("/db/testXQueryTrigger/test-dst"); final EXistCollectionManagementService service = testCollection.getService(EXistCollectionManagementService.class); - final Collection src = service.createCollection("test"); - assertNotNull(src); + try (final Collection src = service.createCollection("test"); + final Collection dst = service.createCollection("test-dst")) { + assertNotNull(src); - final Collection dst = service.createCollection("test-dst"); - assertNotNull(dst); + assertNotNull(dst); + } service.move(srcURI, dstURI, null); // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); - ResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testDstCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testDstCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(BEFORE+MOVE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(AFTER+MOVE+COLLECTION+testDstTestCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(EVENTS); - // TODO(AR) should be 18 results see: https://github.com/eXist-db/exist/issues/4279 - // results should contain: - // BEFORE CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // BEFORE CREATE_COLLECTION(/db/testXQueryTrigger/test-dst): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER CREATE_COLLECTION(/db/testXQueryTrigger/test-dst): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // BEFORE MOVE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER MOVE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testDstCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testDstCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+MOVE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+MOVE+COLLECTION+testDstTestCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(EVENTS)) { + // TODO(AR) should be 18 results see: https://github.com/eXist-db/exist/issues/4279 + // results should contain: + // BEFORE CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // BEFORE CREATE_COLLECTION(/db/testXQueryTrigger/test-dst): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER CREATE_COLLECTION(/db/testXQueryTrigger/test-dst): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // BEFORE MOVE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER MOVE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger // assertEquals(18, result.getSize()); - assertEquals(12, result.getSize()); + assertEquals(12, result.getSize()); + } } /** test a trigger fired by a Collection manipulations */ @@ -697,51 +750,58 @@ public void collectionDelete() throws XMLDBException { idxConf.configureCollection(COLLECTION_CONFIG); final CollectionManagementService service = testCollection.getService(CollectionManagementService.class); - final Collection collection = service.createCollection("test"); - assertNotNull(collection); + try (final Collection collection = service.createCollection("test")) { + assertNotNull(collection); + } service.removeCollection("test"); // remove the trigger for the Collection under test idxConf.configureCollection(EMPTY_COLLECTION_CONFIG); - ResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(BEFORE+DELETE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(AFTER+DELETE+COLLECTION+testCollectionURI); - assertEquals(1, result.getSize()); - - result = existEmbeddedServer.executeQuery(EVENTS); - // TODO(AR) should be 12 results see: https://github.com/eXist-db/exist/issues/4279 - // results should contain: - // BEFORE CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // BEFORE DELETE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER DELETE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger - // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger - // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+CREATE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(BEFORE+DELETE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(AFTER+DELETE+COLLECTION+testCollectionURI)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(EVENTS)) { + // TODO(AR) should be 12 results see: https://github.com/eXist-db/exist/issues/4279 + // results should contain: + // BEFORE CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER CREATE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // BEFORE DELETE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER DELETE_COLLECTION(/db/testXQueryTrigger/test): XQueryTrigger + // BEFORE UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger + // AFTER UPDATE_DOCUMENT(/db/testXQueryTrigger/XQueryTriggerLog.xml): XQueryTrigger // assertEquals(12, result.getSize()); - assertEquals(8, result.getSize()); + assertEquals(8, result.getSize()); + } } @Test public void storeDocumentInvalidTriggerForPrepare() throws XMLDBException { - final BinaryResource invalidModule = testCollection.createResource(MODULE_NAME, BinaryResource.class ); - ((EXistResource)invalidModule).setMediaType(MediaType.APPLICATION_XQUERY); - invalidModule.setContent(INVALID_MODULE.getBytes()); - testCollection.storeResource(invalidModule); + try (final BinaryResource invalidModule = testCollection.createResource(MODULE_NAME, BinaryResource.class )) { + ((EXistResource)invalidModule).setMediaType(MediaType.APPLICATION_XQUERY); + invalidModule.setContent(INVALID_MODULE.getBytes()); + testCollection.storeResource(invalidModule); + } // configure the Collection with the trigger under test final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); @@ -752,9 +812,10 @@ public void storeDocumentInvalidTriggerForPrepare() throws XMLDBException { for(int i = 0; i < max_store_attempts; i++) { try { // this will fire the trigger - final XMLResource doc = testCollection.createResource(DOCUMENT_NAME, XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - testCollection.storeResource(doc); + try (final XMLResource doc = testCollection.createResource(DOCUMENT_NAME, XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + testCollection.storeResource(doc); + } } catch(XMLDBException xdbe) { if (xdbe.getCause() instanceof TriggerException && xdbe.getCause().getMessage().equals(XQueryTrigger.PREPARE_EXCEPTION_MESSAGE)) { count_prepare_exceptions++; diff --git a/exist-core/src/test/java/org/exist/dom/memtree/DocumentBuilderReceiverIntegrationTest.java b/exist-core/src/test/java/org/exist/dom/memtree/DocumentBuilderReceiverIntegrationTest.java index d23f2ef338..101c331677 100644 --- a/exist-core/src/test/java/org/exist/dom/memtree/DocumentBuilderReceiverIntegrationTest.java +++ b/exist-core/src/test/java/org/exist/dom/memtree/DocumentBuilderReceiverIntegrationTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -19,17 +43,16 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - package org.exist.dom.memtree; import com.googlecode.junittoolbox.ParallelParameterized; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import org.xmlunit.builder.DiffBuilder; @@ -46,7 +69,7 @@ import static org.xmldb.api.base.ResourceType.XML_RESOURCE; /** - * https://github.com/eXist-db/exist/issues/1682#issuecomment-402108184 + * https://github.com/eXist-db/exist/issues/1682#issuecomment-402108184 */ @RunWith(ParallelParameterized.class) public class DocumentBuilderReceiverIntegrationTest { @@ -76,24 +99,26 @@ public static java.util.Collection data() { @Test public void mergeDocuments() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery(query); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { - assertNotNull(result); - assertEquals(1, result.getSize()); + assertNotNull(result); + assertEquals(1, result.getSize()); - final Resource resource = result.getResource(0); - assertNotNull(resource); - assertEquals(XML_RESOURCE, resource.getResourceType()); + try (final Resource resource = result.getResource(0)) { + assertNotNull(resource); + assertEquals(XML_RESOURCE, resource.getResourceType()); - final Source expectedSource = Input.fromString(expectedResult).build(); - final Source actualSource = Input.fromNode(((XMLResource)resource).getContentAsDOM()).build(); + final Source expectedSource = Input.fromString(expectedResult).build(); + final Source actualSource = Input.fromNode(((XMLResource) resource).getContentAsDOM()).build(); - final Diff diff = DiffBuilder.compare(expectedSource) - .withTest(actualSource) - .checkForSimilar() - .ignoreWhitespace() - .build(); + final Diff diff = DiffBuilder.compare(expectedSource) + .withTest(actualSource) + .checkForSimilar() + .ignoreWhitespace() + .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + assertFalse(diff.toString(), diff.hasDifferences()); + } + } } } diff --git a/exist-core/src/test/java/org/exist/dom/memtree/MemtreeInXQueryTest.java b/exist-core/src/test/java/org/exist/dom/memtree/MemtreeInXQueryTest.java index b1d92c5f8b..02f7d49cff 100644 --- a/exist-core/src/test/java/org/exist/dom/memtree/MemtreeInXQueryTest.java +++ b/exist-core/src/test/java/org/exist/dom/memtree/MemtreeInXQueryTest.java @@ -47,9 +47,10 @@ import com.googlecode.junittoolbox.ParallelRunner; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; import org.junit.runner.RunWith; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import static org.junit.Assert.assertEquals; @@ -71,12 +72,12 @@ public void pi_attributes() throws XMLDBException { "}\n" + "return count($doc//processing-instruction()/@*)"; - final ResourceSet result = existEmbeddedServer.executeQuery(xquery); - - assertEquals(1, result.getSize()); - assertEquals(0, Integer.parseInt(result.getResource(0).getContent().toString())); - - result.clear(); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(xquery)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(0, Integer.parseInt(resource.getContent().toString())); + } + } } @Test @@ -87,12 +88,12 @@ public void pi_children() throws XMLDBException { "}\n" + "return count($doc//processing-instruction()/node())"; - final ResourceSet result = existEmbeddedServer.executeQuery(xquery); - - assertEquals(1, result.getSize()); - assertEquals(0, Integer.parseInt(result.getResource(0).getContent().toString())); - - result.clear(); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(xquery)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(0, Integer.parseInt(resource.getContent().toString())); + } + } } @Test @@ -103,12 +104,12 @@ public void pi_descendantAttributes() throws XMLDBException { "}\n" + "return count($doc//processing-instruction()//@*)"; - final ResourceSet result = existEmbeddedServer.executeQuery(xquery); - - assertEquals(1, result.getSize()); - assertEquals(0, Integer.parseInt(result.getResource(0).getContent().toString())); - - result.clear(); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(xquery)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(0, Integer.parseInt(resource.getContent().toString())); + } + } } @Test @@ -120,12 +121,12 @@ public void attr_attributes() throws XMLDBException { "} return\n" + " count($doc/a/@x/@y)"; - final ResourceSet result = existEmbeddedServer.executeQuery(xquery); - - assertEquals(1, result.getSize()); - assertEquals(0, Integer.parseInt(result.getResource(0).getContent().toString())); - - result.clear(); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(xquery)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(0, Integer.parseInt(resource.getContent().toString())); + } + } } @Test @@ -137,11 +138,11 @@ public void attr_children() throws XMLDBException { "} return\n" + " count($doc/a/@x/node())"; - final ResourceSet result = existEmbeddedServer.executeQuery(xquery); - - assertEquals(1, result.getSize()); - assertEquals(0, Integer.parseInt(result.getResource(0).getContent().toString())); - - result.clear(); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(xquery)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(0, Integer.parseInt(resource.getContent().toString())); + } + } } } diff --git a/exist-core/src/test/java/org/exist/dom/persistent/CDataIntergationTest.java b/exist-core/src/test/java/org/exist/dom/persistent/CDataIntergationTest.java index 5dd6961618..0fb14ee581 100644 --- a/exist-core/src/test/java/org/exist/dom/persistent/CDataIntergationTest.java +++ b/exist-core/src/test/java/org/exist/dom/persistent/CDataIntergationTest.java @@ -123,23 +123,17 @@ public void cdataXmlDbApi() throws XMLDBException { DatabaseManager.registerDatabase(database); // store document - Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - try { - final Resource resource = root.createResource(docName, XMLResource.class); + try (final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); + final Resource resource = root.createResource(docName, XMLResource.class)) { resource.setContent(cdata_xml); root.storeResource(resource); - } finally { - root.close(); } // retrieve document - root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - try { - final Resource resource = root.getResource(docName); + try (final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); + final Resource resource = root.getResource(docName)) { assertNotNull(resource); assertEquals(cdata_xml, resource.getContent().toString()); - } finally { - root.close(); } } } diff --git a/exist-core/src/test/java/org/exist/security/XMLDBSecurityTest.java b/exist-core/src/test/java/org/exist/security/XMLDBSecurityTest.java index e918b7569a..2c1dd51d20 100644 --- a/exist-core/src/test/java/org/exist/security/XMLDBSecurityTest.java +++ b/exist-core/src/test/java/org/exist/security/XMLDBSecurityTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -28,11 +52,11 @@ import org.exist.security.internal.aider.UserAider; import org.exist.test.ExistWebServer; import org.exist.xmldb.EXistCollectionManagementService; -import org.exist.xmldb.UserManagementService; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.EXistXPathQueryService; +import org.exist.xmldb.UserManagementService; import org.exist.xmldb.XmldbURI; import org.junit.After; -import static org.junit.Assert.*; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; @@ -43,12 +67,17 @@ import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + @RunWith(Parameterized.class) public class XMLDBSecurityTest { @@ -76,50 +105,56 @@ private final String getBaseUri() { @Test(expected=XMLDBException.class) // fails since guest has no write permissions public void worldCreateCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "guest", "guest"); - final CollectionManagementService cms = test.getService(CollectionManagementService.class); - cms.createCollection("createdByGuest"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "guest", "guest")) { + final CollectionManagementService cms = test.getService(CollectionManagementService.class); + try (final Collection createdByGuest = cms.createCollection("createdByGuest")) { } + } } @Test(expected=XMLDBException.class) // fails since guest has no write permissions public void worldAddResource() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "guest", "guest"); - final Resource resource = test.createResource("createdByGuest", XMLResource.class); - resource.setContent(""); - test.storeResource(resource); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "guest", "guest"); + final Resource resource = test.createResource("createdByGuest", XMLResource.class)) { + resource.setContent(""); + test.storeResource(resource); + } } @Test(expected=XMLDBException.class) // fails since guest has no write permissions public void worldRemoveCollection() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", "guest", "guest"); - final CollectionManagementService cms = root.getService(CollectionManagementService.class); - cms.removeCollection("securityTest1"); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", "guest", "guest")) { + final CollectionManagementService cms = root.getService(CollectionManagementService.class); + cms.removeCollection("securityTest1"); + } } @Test(expected=XMLDBException.class) // fails since guest has no write permissions public void worldChmodCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "guest", "guest"); - final UserManagementService ums = test.getService(UserManagementService.class); - // grant myself all rights ;-) - ums.chmod(0777); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "guest", "guest")) { + final UserManagementService ums = test.getService(UserManagementService.class); + // grant myself all rights ;-) + ums.chmod(0777); + } } @Test(expected=XMLDBException.class) // fails since guest has no write permissions public void worldChmodResource() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "guest", "guest"); - final Resource resource = test.getResource("test.xml"); - final UserManagementService ums = test.getService(UserManagementService.class); - // grant myself all rights ;-) - ums.chmod(resource, 0777); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "guest", "guest"); + final Resource resource = test.getResource("test.xml")) { + final UserManagementService ums = test.getService(UserManagementService.class); + // grant myself all rights ;-) + ums.chmod(resource, 0777); + } } @Test(expected=XMLDBException.class) // fails since guest has no write permissions public void worldChownCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "guest", "guest"); - final UserManagementService ums = test.getService(UserManagementService.class); - final Account guest = ums.getAccount("guest"); - // make myself the owner ;-) - ums.chown(guest, "guest"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "guest", "guest")) { + final UserManagementService ums = test.getService(UserManagementService.class); + final Account guest = ums.getAccount("guest"); + // make myself the owner ;-) + ums.chown(guest, "guest"); + } } /** @@ -127,84 +162,95 @@ public void worldChownCollection() throws XMLDBException { */ @Test (expected=XMLDBException.class) public void worldChownResource() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "guest", "guest"); - final Resource resource = test.getResource("test.xml"); - final UserManagementService ums = test.getService(UserManagementService.class); - // grant myself all rights ;-) - final Account test2 = ums.getAccount("guest"); - ums.chown(resource, test2, "guest"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "guest", "guest"); + final Resource resource = test.getResource("test.xml")) { + final UserManagementService ums = test.getService(UserManagementService.class); + // grant myself all rights ;-) + final Account test2 = ums.getAccount("guest"); + ums.chown(resource, test2, "guest"); + } } @Test public void groupCreateSubColl() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); - final CollectionManagementService cms = test.getService(CollectionManagementService.class); - final Collection newCol = cms.createCollection("createdByTest2"); - assertNotNull(newCol); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2")) { + final CollectionManagementService cms = test.getService(CollectionManagementService.class); + try (final Collection newCol = cms.createCollection("createdByTest2")) { + assertNotNull(newCol); + } + } } @Test public void groupCreateResource() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); - Resource resource = test.createResource("createdByTest2.xml", XMLResource.class); - resource.setContent(""); - test.storeResource(resource); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2")) { + try (final Resource resource = test.createResource("createdByTest2.xml", XMLResource.class)) { + resource.setContent(""); + test.storeResource(resource); + } - resource = test.getResource("createdByTest2.xml"); - assertNotNull(resource); - assertEquals("", resource.getContent().toString()); + try (final Resource resource = test.getResource("createdByTest2.xml")) { + assertNotNull(resource); + assertEquals("", resource.getContent().toString()); + } + } } @Test(expected=XMLDBException.class) public void groupRemoveCollection_canNotWriteParent() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", "test2", "test2"); - final CollectionManagementService cms = root.getService(CollectionManagementService.class); - cms.removeCollection("securityTest1"); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", "test2", "test2")) { + final CollectionManagementService cms = root.getService(CollectionManagementService.class); + cms.removeCollection("securityTest1"); + } } @Test public void groupRemoveCollection_canWriteParent() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", "admin", ""); - final CollectionManagementService cms = root.getService(CollectionManagementService.class); - cms.removeCollection("securityTest1"); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", "admin", "")) { + final CollectionManagementService cms = root.getService(CollectionManagementService.class); + cms.removeCollection("securityTest1"); + } } @Test(expected=XMLDBException.class) public void groupChmodCollection_asNotOwnerAndNotDBA() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2")) { + final UserManagementService ums = test.getService(UserManagementService.class); - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); - final UserManagementService ums = test.getService(UserManagementService.class); - - // grant myself all rights ;-) - ums.chmod(07777); + // grant myself all rights ;-) + ums.chmod(07777); + } } @Test public void groupChmodCollection_asOwner() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - // grant myself all rights ;-) - ums.chmod(07777); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + // grant myself all rights ;-) + ums.chmod(07777); - assertEquals("rwsrwsrwt", ums.getPermissions(test).toString()); + assertEquals("rwsrwsrwt", ums.getPermissions(test).toString()); + } } @Test(expected=XMLDBException.class) public void groupChmodResource_asNotOwnerAndNotDBA() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); - final Resource resource = test.getResource("test.xml"); - final UserManagementService ums = test.getService(UserManagementService.class); - // grant myself all rights ;-) - ums.chmod(resource, 0777); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); + final Resource resource = test.getResource("test.xml")) { + final UserManagementService ums = test.getService(UserManagementService.class); + // grant myself all rights ;-) + ums.chmod(resource, 0777); + } } @Test public void groupChmodResource_asOwner() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final Resource resource = test.getResource("test.xml"); - final UserManagementService ums = test.getService(UserManagementService.class); - // grant myself all rights ;-) - ums.chmod(resource, 0777); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.getResource("test.xml")) { + final UserManagementService ums = test.getService(UserManagementService.class); + // grant myself all rights ;-) + ums.chmod(resource, 0777); + } } /** @@ -216,12 +262,13 @@ public void groupChmodResource_asOwner() throws XMLDBException { */ @Test public void dbaChownUidCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "admin", ""); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "admin", "")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to change uid ownership of /db/securityTest1 to the test2 user - final Account test2 = ums.getAccount("test2"); - ums.chown(test2); + // attempt to change uid ownership of /db/securityTest1 to the test2 user + final Account test2 = ums.getAccount("test2"); + ums.chown(test2); + } } /** @@ -233,11 +280,12 @@ public void dbaChownUidCollection() throws XMLDBException { */ @Test public void dbaChownGidCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "admin", ""); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "admin", "")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to change uid ownership of /db/securityTest1 to the guest group - ums.chgrp("guest"); + // attempt to change uid ownership of /db/securityTest1 to the guest group + ums.chgrp("guest"); + } } /** @@ -249,12 +297,13 @@ public void dbaChownGidCollection() throws XMLDBException { */ @Test(expected=XMLDBException.class) public void ownerChownUidCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to change uid ownership of /db/securityTest1 to the test2 user - final Account test2 = ums.getAccount("test2"); - ums.chown(test2); + // attempt to change uid ownership of /db/securityTest1 to the test2 user + final Account test2 = ums.getAccount("test2"); + ums.chown(test2); + } } /** @@ -267,11 +316,12 @@ public void ownerChownUidCollection() throws XMLDBException { */ @Test(expected=XMLDBException.class) public void ownerChownGidCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to change gid ownership of /db/securityTest1 to the guest group - ums.chgrp("guest"); + // attempt to change gid ownership of /db/securityTest1 to the guest group + ums.chgrp("guest"); + } } /** @@ -283,12 +333,13 @@ public void ownerChownGidCollection() throws XMLDBException { */ @Test(expected=XMLDBException.class) public void groupMemberChownUidCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to take uid ownership of /db/securityTest1 - final Account test2 = ums.getAccount("test2"); - ums.chown(test2); + // attempt to take uid ownership of /db/securityTest1 + final Account test2 = ums.getAccount("test2"); + ums.chown(test2); + } } /** @@ -302,14 +353,15 @@ public void groupMemberChownUidCollection() throws XMLDBException { */ @Test public void ownerAndGroupMemberChownGidCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to take gid ownership of /db/securityTest1 - ums.chgrp("extusers"); + // attempt to take gid ownership of /db/securityTest1 + ums.chgrp("extusers"); - final Permission perms = ums.getPermissions(test); - assertEquals("extusers", perms.getGroup().getName()); + final Permission perms = ums.getPermissions(test); + assertEquals("extusers", perms.getGroup().getName()); + } } /** @@ -322,11 +374,12 @@ public void ownerAndGroupMemberChownGidCollection() throws XMLDBException { */ @Test(expected=XMLDBException.class) public void groupMemberChownGidCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to have user 'test2' take gid ownership of /db/securityTest1 (which is owner by test1:users) - ums.chgrp("test2-only"); + // attempt to have user 'test2' take gid ownership of /db/securityTest1 (which is owner by test1:users) + ums.chgrp("test2-only"); + } } /** @@ -339,11 +392,12 @@ public void groupMemberChownGidCollection() throws XMLDBException { */ @Test(expected=XMLDBException.class) public void groupNonMemberChownGidCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to take gid ownership of /db/securityTest1 - ums.chgrp("guest"); + // attempt to take gid ownership of /db/securityTest1 + ums.chgrp("guest"); + } } /** @@ -355,13 +409,14 @@ public void groupNonMemberChownGidCollection() throws XMLDBException { */ @Test public void dbaChownUidResource() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "admin", ""); - final Resource resource = test.getResource("test.xml"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "admin", ""); + final Resource resource = test.getResource("test.xml")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to change uid ownership of /db/securityTest1/test.xml to the test2 user - final Account test2 = ums.getAccount("test2"); - ums.chown(resource, test2); + // attempt to change uid ownership of /db/securityTest1/test.xml to the test2 user + final Account test2 = ums.getAccount("test2"); + ums.chown(resource, test2); + } } /** @@ -373,12 +428,13 @@ public void dbaChownUidResource() throws XMLDBException { */ @Test public void dbaChownGidResource() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "admin", ""); - final Resource resource = test.getResource("test.xml"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "admin", ""); + final Resource resource = test.getResource("test.xml")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to change uid ownership of /db/securityTest1/test.xml to the guest group - ums.chgrp(resource, "guest"); + // attempt to change uid ownership of /db/securityTest1/test.xml to the guest group + ums.chgrp(resource, "guest"); + } } /** @@ -390,13 +446,14 @@ public void dbaChownGidResource() throws XMLDBException { */ @Test(expected=XMLDBException.class) public void ownerChownUidResource() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final Resource resource = test.getResource("test.xml"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.getResource("test.xml")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to change uid ownership of /db/securityTest1/test.xml to the test2 user - final Account test2 = ums.getAccount("test2"); - ums.chown(resource, test2); + // attempt to change uid ownership of /db/securityTest1/test.xml to the test2 user + final Account test2 = ums.getAccount("test2"); + ums.chown(resource, test2); + } } /** @@ -409,12 +466,13 @@ public void ownerChownUidResource() throws XMLDBException { */ @Test(expected=XMLDBException.class) public void ownerChownGidResource() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final Resource resource = test.getResource("test.xml"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.getResource("test.xml")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to change gid ownership of /db/securityTest1/test.xml to the guest group - ums.chgrp(resource, "guest"); + // attempt to change gid ownership of /db/securityTest1/test.xml to the guest group + ums.chgrp(resource, "guest"); + } } @@ -427,13 +485,14 @@ public void ownerChownGidResource() throws XMLDBException { */ @Test(expected=XMLDBException.class) public void groupMemberChownUidResource() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); - final Resource resource = test.getResource("test.xml"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); + final Resource resource = test.getResource("test.xml")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to take uid ownership of /db/securityTest1/test.xml - final Account test2 = ums.getAccount("test2"); - ums.chown(resource, test2); + // attempt to take uid ownership of /db/securityTest1/test.xml + final Account test2 = ums.getAccount("test2"); + ums.chown(resource, test2); + } } /** @@ -447,15 +506,16 @@ public void groupMemberChownUidResource() throws XMLDBException { */ @Test public void ownerAndGroupMemberChownGidResource() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final Resource resource = test.getResource("test.xml"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.getResource("test.xml")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to take gid ownership of /db/securityTest1 - ums.chgrp(resource, "extusers"); + // attempt to take gid ownership of /db/securityTest1 + ums.chgrp(resource, "extusers"); - final Permission perms = ums.getPermissions(resource); - assertEquals("extusers", perms.getGroup().getName()); + final Permission perms = ums.getPermissions(resource); + assertEquals("extusers", perms.getGroup().getName()); + } } /** @@ -468,12 +528,13 @@ public void ownerAndGroupMemberChownGidResource() throws XMLDBException { */ @Test(expected=XMLDBException.class) public void groupMemberChownGidResource() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); - final Resource resource = test.getResource("test.xml"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); + final Resource resource = test.getResource("test.xml")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to have user 'test2' take gid ownership of /db/securityTest1/test.xml (which is owned by test1:users) - ums.chgrp(resource, "test2-only"); + // attempt to have user 'test2' take gid ownership of /db/securityTest1/test.xml (which is owned by test1:users) + ums.chgrp(resource, "test2-only"); + } } /** @@ -486,392 +547,403 @@ public void groupMemberChownGidResource() throws XMLDBException { */ @Test(expected=XMLDBException.class) public void groupNonMemberChownGidResource() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); - final Resource resource = test.getResource("test.xml"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); + final Resource resource = test.getResource("test.xml")) { + final UserManagementService ums = test.getService(UserManagementService.class); - // attempt to take gid ownership of /db/securityTest1/test.xml - ums.chgrp(resource, "guest"); + // attempt to take gid ownership of /db/securityTest1/test.xml + ums.chgrp(resource, "guest"); + } } @Test public void onlyExecuteRequiredToOpenCollectionContent() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - ums.chmod("--x------"); - test.close(); + ums.chmod("--x------"); + test.close(); - DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + try (final Collection reopened = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { } + } } @Test(expected=XMLDBException.class) public void cannotOpenCollectionWithoutExecute() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - ums.chmod("rw-rw-rw-"); - test.close(); + ums.chmod("rw-rw-rw-"); + test.close(); - DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + try (final Collection reopened = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { } + } } @Test public void canOpenCollectionWithExecute() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - ums.chmod("--x--x--x"); - test.close(); + ums.chmod("--x--x--x"); + test.close(); - DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + try (final Collection reopened = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { } + } } @Test(expected=XMLDBException.class) public void cannotOpenRootCollectionWithoutExecute() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db", "admin", ""); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db", "admin", "")) { + final UserManagementService ums = test.getService(UserManagementService.class); - ums.chmod("rw-rw-rw-"); - test.close(); + ums.chmod("rw-rw-rw-"); + test.close(); - DatabaseManager.getCollection(getBaseUri() + "/db", "test1", "test1"); + try (final Collection reopened = DatabaseManager.getCollection(getBaseUri() + "/db", "test1", "test1")) { } + } } @Test public void canOpenRootCollectionWithExecute() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db", "admin", ""); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db", "admin", "")) { + final UserManagementService ums = test.getService(UserManagementService.class); - ums.chmod("--x--x--x"); - test.close(); + ums.chmod("--x--x--x"); + test.close(); - DatabaseManager.getCollection(getBaseUri() + "/db", "test1", "test1"); + try (final Collection reopened = DatabaseManager.getCollection(getBaseUri() + "/db", "test1", "test1")) { } + } } @Test public void onlyReadAndExecuteRequiredToListCollectionResources() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - ums.chmod("r-x------"); + ums.chmod("r-x------"); - test.listResources(); + test.listResources(); + } } @Test(expected=XMLDBException.class) public void cannotListCollectionResourcesWithoutRead() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - ums.chmod("-wx-wx-wx"); - test.close(); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + ums.chmod("-wx-wx-wx"); + } - test.listResources(); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + test.listResources(); + } } @Test public void onlyReadAndExecuteRequiredToListCollectionSubCollections() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - ums.chmod("r-x------"); + ums.chmod("r-x------"); - test.listChildCollections(); + test.listChildCollections(); + } } @Test(expected=XMLDBException.class) public void cannotListCollectionSubCollectionsWithoutRead() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); + try (Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - ums.chmod("-wx-wx-wx"); - test.close(); - - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + ums.chmod("-wx-wx-wx"); + } - test.listChildCollections(); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + test.listChildCollections(); + } } @Test - public void canReadXmlResourceWithOnlyExecutePermissionOnParentCollection() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - ums.chmod("--x------"); - test.close(); - - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + public void canReadXmlResourceWithOnlyExecutePermissionOnParentCollection() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + ums.chmod("--x------"); + } - final Resource resource = test.getResource("test.xml"); - assertEquals("", resource.getContent()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.getResource("test.xml")) { + assertEquals("", resource.getContent()); + } } @Test(expected=XMLDBException.class) - public void cannotReadXmlResourceWithoutExecutePermissionOnParentCollection() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - ums.chmod("rw-------"); - test.close(); - - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + public void cannotReadXmlResourceWithoutExecutePermissionOnParentCollection() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + ums.chmod("rw-------"); + } - final Resource resource = test.getResource("test.xml"); - assertEquals("", resource.getContent()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.getResource("test.xml")) { + assertEquals("", resource.getContent()); + } } @Test - public void canReadBinaryResourceWithOnlyExecutePermissionOnParentCollection() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - ums.chmod("--x------"); - test.close(); - - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + public void canReadBinaryResourceWithOnlyExecutePermissionOnParentCollection() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + ums.chmod("--x------"); + } - final Resource resource = test.getResource("test.bin"); - assertArrayEquals("binary-test".getBytes(), (byte[])resource.getContent()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.getResource("test.bin")) { + assertArrayEquals("binary-test".getBytes(), (byte[]) resource.getContent()); + } } @Test(expected=XMLDBException.class) - public void cannotReadBinaryResourceWithoutExecutePermissionOnParentCollection() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - ums.chmod("rw-------"); - test.close(); - - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + public void cannotReadBinaryResourceWithoutExecutePermissionOnParentCollection() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + ums.chmod("rw-------"); + } - final Resource resource = test.getResource("test.bin"); - assertArrayEquals("binary-test".getBytes(), (byte[])resource.getContent()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")){ + final Resource resource = test.getResource("test.bin"); + assertArrayEquals("binary-test".getBytes(), (byte[]) resource.getContent()); + } } @Test - public void canReadXmlResourceWithOnlyReadPermission() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - Resource resource = test.getResource("test.xml"); - ums.chmod(resource, "r--------"); - test.close(); + public void canReadXmlResourceWithOnlyReadPermission() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + try (final Resource resource = test.getResource("test.xml")) { + ums.chmod(resource, "r--------"); + } + } - resource = test.getResource("test.xml"); - assertEquals("", resource.getContent()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.getResource("test.xml")) { + assertEquals("", resource.getContent()); + } } @Test(expected=XMLDBException.class) - public void cannotReadXmlResourceWithoutReadPermission() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - Resource resource = test.getResource("test.xml"); - ums.chmod(resource, "-wx------"); - test.close(); + public void cannotReadXmlResourceWithoutReadPermission() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + try (final Resource resource = test.getResource("test.xml")) { + ums.chmod(resource, "-wx------"); + } + } - resource = test.getResource("test.xml"); - assertEquals("", resource.getContent()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.getResource("test.xml")) { + assertEquals("", resource.getContent()); + } } @Test - public void canReadBinaryResourceWithOnlyReadPermission() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); + public void canReadBinaryResourceWithOnlyReadPermission() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - Resource resource = test.getResource("test.bin"); - ums.chmod(resource, "r--------"); - test.close(); - - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + try (final Resource resource = test.getResource("test.bin")) { + ums.chmod(resource, "r--------"); + } + } - resource = test.getResource("test.bin"); - assertArrayEquals("binary-test".getBytes(), (byte[])resource.getContent()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.getResource("test.bin")) { + assertArrayEquals("binary-test".getBytes(), (byte[]) resource.getContent()); + } } @Test(expected=XMLDBException.class) - public void cannotReadBinaryResourceWithoutReadPermission() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - Resource resource = test.getResource("test.bin"); - ums.chmod(resource, "-wx------"); - test.close(); + public void cannotReadBinaryResourceWithoutReadPermission() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + try (final Resource resource = test.getResource("test.bin")) { + ums.chmod(resource, "-wx------"); + } + } - resource = test.getResource("test.bin"); - assertArrayEquals("binary-test".getBytes(), (byte[])resource.getContent()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.getResource("test.bin")) { + assertArrayEquals("binary-test".getBytes(), (byte[]) resource.getContent()); + } } @Test - public void canCreateXmlResourceWithOnlyExecuteAndWritePermissionOnParentCollection() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - ums.chmod("-wx------"); - test.close(); - - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + public void canCreateXmlResourceWithOnlyExecuteAndWritePermissionOnParentCollection() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + ums.chmod("-wx------"); + } - final Resource resource = test.createResource("other.xml", XMLResource.class); - resource.setContent(""); - test.storeResource(resource); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.createResource("other.xml", XMLResource.class)) { + resource.setContent(""); + test.storeResource(resource); + } } @Test(expected=XMLDBException.class) - public void cannotCreateXmlResourceWithoutWritePermissionOnParentCollection() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - ums.chmod("--x------"); - test.close(); - - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + public void cannotCreateXmlResourceWithoutWritePermissionOnParentCollection() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + ums.chmod("--x------"); + } - final Resource resource = test.createResource("other.xml", XMLResource.class); - resource.setContent(""); - test.storeResource(resource); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.createResource("other.xml", XMLResource.class)) { + resource.setContent(""); + test.storeResource(resource); + } } @Test - public void canCreateBinaryResourceWithOnlyExecuteAndWritePermissionOnParentCollection() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - ums.chmod("-wx------"); - test.close(); - - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + public void canCreateBinaryResourceWithOnlyExecuteAndWritePermissionOnParentCollection() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + ums.chmod("-wx------"); + } - final Resource resource = test.createResource("other.bin", BinaryResource.class); - resource.setContent("binary".getBytes()); - test.storeResource(resource); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.createResource("other.bin", BinaryResource.class)) { + resource.setContent("binary".getBytes()); + test.storeResource(resource); + } } @Test(expected=XMLDBException.class) - public void cannotCreateBinaryResourceWithoutWritePermissionOnParentCollection() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - ums.chmod("--x------"); - test.close(); - - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + public void cannotCreateBinaryResourceWithoutWritePermissionOnParentCollection() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + ums.chmod("--x------"); + } - final Resource resource = test.createResource("other.bin", BinaryResource.class); - resource.setContent("binary".getBytes()); - test.storeResource(resource); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.createResource("other.bin", BinaryResource.class)) { + resource.setContent("binary".getBytes()); + test.storeResource(resource); + } } @Test - public void canUpdateXmlResourceWithOnlyExecutePermissionOnParentCollection() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - ums.chmod("--x------"); - test.close(); + public void canUpdateXmlResourceWithOnlyExecutePermissionOnParentCollection() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + ums.chmod("--x------"); + } - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { - Resource resource = test.getResource("test.xml"); - assertEquals("", resource.getContent()); + try (final Resource resource = test.getResource("test.xml")) { + assertEquals("", resource.getContent()); - //update the resource - resource.setContent(""); - test.storeResource(resource); + //update the resource + resource.setContent(""); + test.storeResource(resource); + } - resource = test.getResource("test.xml"); - assertEquals("", resource.getContent()); + try (final Resource resource = test.getResource("test.xml")) { + assertEquals("", resource.getContent()); + } + } } @Test(expected=XMLDBException.class) - public void cannotUpdateXmlResourceWithoutExecutePermissionOnParentCollection() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - ums.chmod("rw-------"); - test.close(); - - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + public void cannotUpdateXmlResourceWithoutExecutePermissionOnParentCollection() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + ums.chmod("rw-------"); + } - Resource resource = test.getResource("test.xml"); - assertEquals("", resource.getContent()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.getResource("test.xml")) { + assertEquals("", resource.getContent()); - // attempt to pdate the resource - resource.setContent(""); - test.storeResource(resource); + // attempt to pdate the resource + resource.setContent(""); + test.storeResource(resource); + } } @Test - public void canUpdateBinaryResourceWithOnlyExecutePermissionOnParentCollection() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - ums.chmod("--x------"); - test.close(); + public void canUpdateBinaryResourceWithOnlyExecutePermissionOnParentCollection() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + ums.chmod("--x------"); + } - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { - Resource resource = test.getResource("test.bin"); - assertArrayEquals("binary-test".getBytes(), (byte[])resource.getContent()); + try (final Resource resource = test.getResource("test.bin")) { + assertArrayEquals("binary-test".getBytes(), (byte[]) resource.getContent()); - //update the resource - resource.setContent("testing".getBytes()); - test.storeResource(resource); + //update the resource + resource.setContent("testing".getBytes()); + test.storeResource(resource); + } - resource = test.getResource("test.bin"); - assertArrayEquals("testing".getBytes(), (byte[])resource.getContent()); + try (final Resource resource = test.getResource("test.bin")) { + assertArrayEquals("testing".getBytes(), (byte[]) resource.getContent()); + } + } } @Test(expected=XMLDBException.class) - public void cannotUpdateBinaryResourceWithoutExecutePermissionOnParentCollection() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - - ums.chmod("rw-------"); - test.close(); - - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + public void cannotUpdateBinaryResourceWithoutExecutePermissionOnParentCollection() throws XMLDBException { + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + ums.chmod("rw-------"); + } - Resource resource = test.getResource("test.bin"); - assertArrayEquals("binary-test".getBytes(), (byte[])resource.getContent()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource resource = test.getResource("test.bin")) { + assertArrayEquals("binary-test".getBytes(), (byte[]) resource.getContent()); - //attempt to update the resource - resource.setContent("testing".getBytes()); - test.storeResource(resource); + //attempt to update the resource + resource.setContent("testing".getBytes()); + test.storeResource(resource); + } } @Test - public void canExecuteXQueryWithOnlyExecutePermissionOnParentCollection() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - + public void canExecuteXQueryWithOnlyExecutePermissionOnParentCollection() throws XMLDBException { final String xquery = "{ 1 + 1 }"; - Resource xqueryResource = test.createResource("test.xquery", BinaryResource.class); - xqueryResource.setContent(xquery); - test.storeResource(xqueryResource); - ums.chmod("--x------"); - ums.chmod(xqueryResource, "rwx------"); //set execute bit on xquery (its off by default!) - test.close(); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); + + try (final Resource xqueryResource = test.createResource("test.xquery", BinaryResource.class)) { + xqueryResource.setContent(xquery); + test.storeResource(xqueryResource); - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + ums.chmod("--x------"); + ums.chmod(xqueryResource, "rwx------"); //set execute bit on xquery (it's off by default!) + } + } - xqueryResource = test.getResource("test.xquery"); - assertEquals(xquery, new String((byte[])xqueryResource.getContent())); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource xqueryResource = test.getResource("test.xquery")) { + assertEquals(xquery, new String((byte[]) xqueryResource.getContent())); - //execute the stored XQuery - final EXistXPathQueryService queryService = test.getService(EXistXPathQueryService.class); - final ResourceSet result = queryService.executeStoredQuery("/db/securityTest1/test.xquery"); - assertEquals("2", result.getResource(0).getContent()); + //execute the stored XQuery + final EXistXPathQueryService queryService = test.getService(EXistXPathQueryService.class); + try (final EXistResourceSet result = queryService.executeStoredQuery("/db/securityTest1/test.xquery")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("2", resource.getContent()); + } + } + } } /** @@ -882,96 +954,122 @@ public void canExecuteXQueryWithOnlyExecutePermissionOnParentCollection() throws * messages from 08/02/2012 */ @Test - public void canExecuteXQueryWithOnlyExecuteAndReadPermission() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - + public void canExecuteXQueryWithOnlyExecuteAndReadPermission() throws XMLDBException { final String xquery = "{ 1 + 2 }"; - Resource xqueryResource = test.createResource("test.xquery", BinaryResource.class); - xqueryResource.setContent(xquery); - test.storeResource(xqueryResource); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - ums.chmod(xqueryResource, "r-x------"); //execute only on xquery - test.close(); + try (final Resource xqueryResource = test.createResource("test.xquery", BinaryResource.class)) { + xqueryResource.setContent(xquery); + test.storeResource(xqueryResource); - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + ums.chmod(xqueryResource, "r-x------"); //execute only on xquery + } + } - xqueryResource = test.getResource("test.xquery"); - assertEquals(xquery, new String((byte[])xqueryResource.getContent())); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource xqueryResource = test.getResource("test.xquery")) { + assertEquals(xquery, new String((byte[]) xqueryResource.getContent())); - //execute the stored XQuery - final EXistXPathQueryService queryService = test.getService(EXistXPathQueryService.class); - final ResourceSet result = queryService.executeStoredQuery("/db/securityTest1/test.xquery"); - assertEquals("3", result.getResource(0).getContent()); + //execute the stored XQuery + final EXistXPathQueryService queryService = test.getService(EXistXPathQueryService.class); + try (final EXistResourceSet result = queryService.executeStoredQuery("/db/securityTest1/test.xquery")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent()); + } + } + } } @Test(expected=XMLDBException.class) - public void cannotExecuteXQueryWithoutExecutePermission() throws XMLDBException{ - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - final UserManagementService ums = test.getService(UserManagementService.class); - + public void cannotExecuteXQueryWithoutExecutePermission() throws XMLDBException { final String xquery = "{ 1 + 2 }"; - Resource xqueryResource = test.createResource("test.xquery", BinaryResource.class); - xqueryResource.setContent(xquery); - test.storeResource(xqueryResource); - ums.chmod(xqueryResource, "rw-------"); //execute only on xquery - test.close(); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService ums = test.getService(UserManagementService.class); - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + try (final Resource xqueryResource = test.createResource("test.xquery", BinaryResource.class)) { + xqueryResource.setContent(xquery); + test.storeResource(xqueryResource); + ums.chmod(xqueryResource, "rw-------"); //execute only on xquery + } + } - xqueryResource = test.getResource("test.xquery"); - assertEquals(xquery, new String((byte[])xqueryResource.getContent())); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); + final Resource xqueryResource = test.getResource("test.xquery")) { + assertEquals(xquery, new String((byte[]) xqueryResource.getContent())); - //execute the stored XQuery - final EXistXPathQueryService queryService = test.getService(EXistXPathQueryService.class); - final ResourceSet result = queryService.executeStoredQuery("/db/securityTest1/test.xquery"); - assertEquals("3", result.getResource(0).getContent()); + //execute the stored XQuery + final EXistXPathQueryService queryService = test.getService(EXistXPathQueryService.class); + try (final EXistResourceSet result = queryService.executeStoredQuery("/db/securityTest1/test.xquery")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent()); + } + } + } } @Test(expected=XMLDBException.class) public void cannotOpenCollection() throws XMLDBException { //check that a user not in the users group (i.e. test3) cannot open the collection /db/securityTest1 - DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test3", "test3"); + try (final Collection collection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test3", "test3")) { + // needed to ensure that collection is closed + } } @Test public void canOpenCollection() throws XMLDBException { //check that a user in the users group (i.e. test2) can open the collection /db/securityTest1 - DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); + try (final Collection collection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + // needed to ensure that collection is closed + } + try (final Collection collection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2")) { + // needed to ensure that collection is closed + } //check that any user can open the collection /db/securityTest3 - DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1"); - DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test2", "test2"); - DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3"); + try (final Collection collection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1")) { + // needed to ensure that collection is closed + } + try (final Collection collection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test2", "test2")) { + // needed to ensure that collection is closed + } + try (final Collection collection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3")) { + // needed to ensure that collection is closed + } } @Test public void copyCollectionWithResources() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create collection owned by "test1", and group "users" in /db/securityTest3 - Collection source = cms.createCollection("source"); + //create collection owned by "test1", and group "users" in /db/securityTest3 + try (final Collection source = cms.createCollection("source")) { - //create resource owned by "test1", and group "users" in /db/securityTest3/source - Resource resSource = source.createResource("source1.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); + //create resource owned by "test1", and group "users" in /db/securityTest3/source + try (final Resource resSource = source.createResource("source1.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } - resSource = source.createResource("source2.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); + try (final Resource resSource = source.createResource("source2.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } + } + } //as the 'test3' user copy the collection - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3"); - cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); - final Collection copyOfSource = test.getChildCollection("copy-of-source"); - assertNotNull(copyOfSource); - assertEquals(2, copyOfSource.listResources().size()); + try (final Collection copyOfSource = test.getChildCollection("copy-of-source")) { + assertNotNull(copyOfSource); + assertEquals(2, copyOfSource.listResources().size()); + } + } } /** @@ -993,35 +1091,41 @@ public void copyCollectionWithResources() throws XMLDBException { */ @Test public void copyCollectionWithResources_destExists_destIsWritable() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + + //create collection owned by "test1", and group "users" in /db/securityTest3 + try (final Collection source = cms.createCollection("source")) { - //create collection owned by "test1", and group "users" in /db/securityTest3 - Collection source = cms.createCollection("source"); + //create resource owned by "test1", and group "users" in /db/securityTest3/source + try (final Resource resSource = source.createResource("source1.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } - //create resource owned by "test1", and group "users" in /db/securityTest3/source - Resource resSource = source.createResource("source1.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); + try (final Resource resSource = source.createResource("source2.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } + } - resSource = source.createResource("source2.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); - - //pre-create the destination and set writable by all - final Collection dest = cms.createCollection("copy-of-source"); - final UserManagementService ums = dest.getService(UserManagementService.class); - ums.chmod(0777); + //pre-create the destination and set writable by all + try (final Collection dest = cms.createCollection("copy-of-source")) { + final UserManagementService ums = dest.getService(UserManagementService.class); + ums.chmod(0777); + } + } - //as the 'test3' user copy the collection - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3"); - cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); - final Collection copyOfSource = test.getChildCollection("copy-of-source"); - assertNotNull(copyOfSource); - assertEquals(2, copyOfSource.listResources().size()); + try (final Collection copyOfSource = test.getChildCollection("copy-of-source")) { + assertNotNull(copyOfSource); + assertEquals(2, copyOfSource.listResources().size()); + } + } } /** @@ -1043,30 +1147,36 @@ public void copyCollectionWithResources_destExists_destIsWritable() throws XMLDB */ @Test(expected=XMLDBException.class) public void copyCollectionWithResources_destExists_destIsNotWritable() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create collection owned by "test1", and group "users" in /db/securityTest3 - Collection source = cms.createCollection("source"); + //create collection owned by "test1", and group "users" in /db/securityTest3 + try (final Collection source = cms.createCollection("source")) { - //create resource owned by "test1", and group "users" in /db/securityTest3/source - Resource resSource = source.createResource("source1.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); + //create resource owned by "test1", and group "users" in /db/securityTest3/source + try (final Resource resSource = source.createResource("source1.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } - resSource = source.createResource("source2.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); - - //pre-create the destination with default mode (0755) - //so that it is not writable by 'test3' user - final Collection dest = cms.createCollection("copy-of-source"); + try (final Resource resSource = source.createResource("source2.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } + } + //pre-create the destination with default mode (0755) + //so that it is not writable by 'test3' user + try (final Collection dest = cms.createCollection("copy-of-source")) { + // needed to make sure that dest is closed + } + } //as the 'test3' user copy the collection - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3"); - cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); + } } /** @@ -1097,231 +1207,272 @@ public void copyCollectionWithResources_destExists_destIsNotWritable() throws XM */ @Test(expected=XMLDBException.class) public void copyCollectionWithResources_destResourceExists_destResourceIsNotWritable() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create collection owned by "test1", and group "users" in /db/securityTest3 - Collection source = cms.createCollection("source"); + //create collection owned by "test1", and group "users" in /db/securityTest3 + try (final Collection source = cms.createCollection("source")){ - //create resource owned by "test1", and group "users" in /db/securityTest3/source - Resource resSource = source.createResource("source1.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); + //create resource owned by "test1", and group "users" in /db/securityTest3/source + try (final Resource resSource = source.createResource("source1.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } - resSource = source.createResource("source2.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); - - //pre-create the destination and set writable by all - final Collection dest = cms.createCollection("copy-of-source"); - UserManagementService ums = dest.getService(UserManagementService.class); - ums.chmod(0777); - - //pre-create a destination resource and set no access to group and others - Resource resDestSource1 = dest.createResource("source1.xml", XMLResource.class); - resDestSource1.setContent(""); - dest.storeResource(resDestSource1); - ums.chmod(resDestSource1, 0700); - + try (final Resource resSource = source.createResource("source2.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } + } + + //pre-create the destination and set writable by all + try (final Collection dest = cms.createCollection("copy-of-source")) { + final UserManagementService ums = dest.getService(UserManagementService.class); + ums.chmod(0777); + + //pre-create a destination resource and set no access to group and others + try (final Resource resDestSource1 = dest.createResource("source1.xml", XMLResource.class)) { + resDestSource1.setContent(""); + dest.storeResource(resDestSource1); + ums.chmod(resDestSource1, 0700); + } + } + } //as the 'test3' user copy the collection - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3"); - cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); - - final Collection copyOfSource = test.getChildCollection("copy-of-source"); - assertNotNull(copyOfSource); - assertEquals(2, copyOfSource.listResources().size()); - - final Resource resCopyOfSource1 = copyOfSource.getResource("source1.xml"); - assertEquals("", resCopyOfSource1.getContent().toString()); - - final Resource resCopyOfSource2 = copyOfSource.getResource("source2.xml"); - assertEquals("", resCopyOfSource2.getContent().toString()); - - //TODO check perms are/areNot preserved? on the replaced resource + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); + + try (final Collection copyOfSource = test.getChildCollection("copy-of-source")) { + assertNotNull(copyOfSource); + assertEquals(2, copyOfSource.listResources().size()); + + try (final Resource resCopyOfSource1 = copyOfSource.getResource("source1.xml")) { + assertEquals("", resCopyOfSource1.getContent().toString()); + } + + try (final Resource resCopyOfSource2 = copyOfSource.getResource("source2.xml")) { + assertEquals("", resCopyOfSource2.getContent().toString()); + } + } + + //TODO check perms are/areNot preserved? on the replaced resource + } } @Test public void copyCollectionWithResources_withSubCollectionWithResource() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create collection owned by "test1", and group "users" in /db/securityTest3 - Collection source = cms.createCollection("source"); + //create collection owned by "test1", and group "users" in /db/securityTest3 + try (final Collection source = cms.createCollection("source")) { - //create resource owned by "test1", and group "users" in /db/securityTest3/source - Resource resSource = source.createResource("source1.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); + //create resource owned by "test1", and group "users" in /db/securityTest3/source + try (final Resource resSource = source.createResource("source1.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } - resSource = source.createResource("source2.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); - - //create sub-collection "sub" owned by "test1", and group "users" in /db/securityTest3/source - CollectionManagementService cms1 = source.getService(CollectionManagementService.class); - Collection sub = cms1.createCollection("sub"); - - //create resource owned by "test1", and group "users" in /db/securityTest3/source/sub1 - Resource resSub = sub.createResource("sub1.xml", XMLResource.class); - resSub.setContent(""); - sub.storeResource(resSub); + try (final Resource resSource = source.createResource("source2.xml", XMLResource.class)){ + resSource.setContent(""); + source.storeResource(resSource); + } + + //create sub-collection "sub" owned by "test1", and group "users" in /db/securityTest3/source + final CollectionManagementService cms1 = source.getService(CollectionManagementService.class); + try (final Collection sub = cms1.createCollection("sub")) { + + //create resource owned by "test1", and group "users" in /db/securityTest3/source/sub1 + try (final Resource resSub = sub.createResource("sub1.xml", XMLResource.class)) { + resSub.setContent(""); + sub.storeResource(resSub); + } + } + } + } //as the 'test3' user copy the collection - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3"); - cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); - final Collection copyOfSource = test.getChildCollection("copy-of-source"); - assertNotNull(copyOfSource); - assertEquals(2, copyOfSource.listResources().size()); - - final Collection copyOfSub = copyOfSource.getChildCollection("sub"); - assertNotNull(copyOfSub); - assertEquals(1, copyOfSub.listResources().size()); + try (final Collection copyOfSource = test.getChildCollection("copy-of-source")) { + assertNotNull(copyOfSource); + assertEquals(2, copyOfSource.listResources().size()); + + try (final Collection copyOfSub = copyOfSource.getChildCollection("sub")) { + assertNotNull(copyOfSub); + assertEquals(1, copyOfSub.listResources().size()); + } + } + } } @Test public void copyDocument_doesNotPreservePermissions() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create resource owned by "test1", and group "users" in /db/securityTest3 - final Resource resSource = test.createResource("source.xml", XMLResource.class); - resSource.setContent(""); - test.storeResource(resSource); + //create resource owned by "test1", and group "users" in /db/securityTest3 + try (final Resource resSource = test.createResource("source.xml", XMLResource.class)) { + resSource.setContent(""); + test.storeResource(resSource); + } + } //as the 'test3' user copy the resource - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3"); - cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - cms.copyResource("/db/securityTest3/source.xml", "/db/securityTest3", "copy-of-source.xml"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copyResource("/db/securityTest3/source.xml", "/db/securityTest3", "copy-of-source.xml"); - final UserManagementService ums = test.getService(UserManagementService.class); - final Permission permissions = ums.getPermissions(test.getResource("copy-of-source.xml")); + final UserManagementService ums = test.getService(UserManagementService.class); + final Permission permissions = ums.getPermissions(test.getResource("copy-of-source.xml")); - //resource should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source.xml - assertEquals("test3", permissions.getOwner().getName()); - assertEquals("guest", permissions.getGroup().getName()); + //resource should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source.xml + assertEquals("test3", permissions.getOwner().getName()); + assertEquals("guest", permissions.getGroup().getName()); + } } @Test public void copyDocument_doesPreservePermissions_whenDestResourceExists() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create resource owned by "test1", and group "users" in /db/securityTest3 - final Resource resSource = test.createResource("source.xml", XMLResource.class); - resSource.setContent(""); - test.storeResource(resSource); - - //pre-create the dest resource (before the copy) and set writable by all - final Resource resDest = test.createResource("copy-of-source.xml", XMLResource.class); - resDest.setContent(""); - test.storeResource(resDest); - UserManagementService ums = test.getService(UserManagementService.class); - ums.chmod(resDest, 0777); + //create resource owned by "test1", and group "users" in /db/securityTest3 + try (final Resource resSource = test.createResource("source.xml", XMLResource.class)) { + resSource.setContent(""); + test.storeResource(resSource); + } + //pre-create the dest resource (before the copy) and set writable by all + try (final Resource resDest = test.createResource("copy-of-source.xml", XMLResource.class)) { + resDest.setContent(""); + test.storeResource(resDest); + + final UserManagementService ums = test.getService(UserManagementService.class); + ums.chmod(resDest, 0777); + } + } //as the 'test3' user copy the resource - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3"); - cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - cms.copyResource("/db/securityTest3/source.xml", "/db/securityTest3", "copy-of-source.xml"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copyResource("/db/securityTest3/source.xml", "/db/securityTest3", "copy-of-source.xml"); - //as test3 user! - ums = test.getService(UserManagementService.class); - final Permission permissions = ums.getPermissions(test.getResource("copy-of-source.xml")); + //as test3 user! + final UserManagementService ums = test.getService(UserManagementService.class); + final Permission permissions = ums.getPermissions(test.getResource("copy-of-source.xml")); - //resource should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source.xml - assertEquals("test1", permissions.getOwner().getName()); - assertEquals("users", permissions.getGroup().getName()); - - //TODO copy collection should do the same??!? + //resource should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source.xml + assertEquals("test1", permissions.getOwner().getName()); + assertEquals("users", permissions.getGroup().getName()); + + //TODO copy collection should do the same??!? + } } @Test public void copyCollection_doesNotPreservePermissions() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create collection owned by "test1", and group "users" in /db/securityTest3 - Collection source = cms.createCollection("source"); + //create collection owned by "test1", and group "users" in /db/securityTest3 + try (final Collection source = cms.createCollection("source")) { + // needed to ensure that source is closed + } + } //as the 'test3' user copy the collection - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3"); - cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); - final UserManagementService ums = test.getService(UserManagementService.class); - final Permission permissions = ums.getPermissions(test.getChildCollection("copy-of-source")); + final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection copyOfSource = test.getChildCollection("copy-of-source")) { + final Permission permissions = ums.getPermissions(copyOfSource); - //collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users collection /db/securityTest3/source - assertEquals("test3", permissions.getOwner().getName()); - assertEquals("guest", permissions.getGroup().getName()); + //collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users collection /db/securityTest3/source + assertEquals("test3", permissions.getOwner().getName()); + assertEquals("guest", permissions.getGroup().getName()); + } + } } - + @Test public void copyCollection_doesPreservePermissions_whenDestCollectionExists() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create collection owned by "test1", and group "users" in /db/securityTest3 - Collection source = cms.createCollection("source"); - - //pre-create the dest collection and grant access to all (0777) - Collection dest = cms.createCollection("copy-of-source"); - UserManagementService ums = dest.getService(UserManagementService.class); - ums.chmod(0777); + //create collection owned by "test1", and group "users" in /db/securityTest3 + try (final Collection source = cms.createCollection("source")) { - //as the 'test3' user copy the collection - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3"); - cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); - - //re-get ums as 'test3' user - ums = test.getService(UserManagementService.class); - final Permission permissions = ums.getPermissions(test.getChildCollection("copy-of-source")); + //pre-create the dest collection and grant access to all (0777) + try (final Collection dest = cms.createCollection("copy-of-source")) { + final UserManagementService ums = dest.getService(UserManagementService.class); + ums.chmod(0777); + } + } + } - //collection should STILL be owned by test1:users, i.e. permissions were preserved from the test1 users collection /db/securityTest3/copy-of-source - assertEquals("test1", permissions.getOwner().getName()); - assertEquals("users", permissions.getGroup().getName()); + //as the 'test3' user copy the collection + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); + + //re-get ums as 'test3' user + final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection copyOfSource = test.getChildCollection("copy-of-source")) { + final Permission permissions = ums.getPermissions(copyOfSource); + + //collection should STILL be owned by test1:users, i.e. permissions were preserved from the test1 users collection /db/securityTest3/copy-of-source + assertEquals("test1", permissions.getOwner().getName()); + assertEquals("users", permissions.getGroup().getName()); + } + } } @Test public void copyCollection_doesPreservePermissionsOfSubDocuments() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - cms.copy(XmldbURI.create("/db/securityTest1"), XmldbURI.create("/db/securityTest3"), XmldbURI.create("copy-of-securityTest1")); + cms.copy(XmldbURI.create("/db/securityTest1"), XmldbURI.create("/db/securityTest3"), XmldbURI.create("copy-of-securityTest1")); - final Collection testCopy = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3/copy-of-securityTest1", "test1", "test1"); + try (final Collection testCopy = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3/copy-of-securityTest1", "test1", "test1")) { - final UserManagementService ums = testCopy.getService(UserManagementService.class); - final Resource resource = testCopy.getResource("test.xml"); - final Permission permissions = ums.getPermissions(resource); + final UserManagementService ums = testCopy.getService(UserManagementService.class); + try (final Resource resource = testCopy.getResource("test.xml")) { + final Permission permissions = ums.getPermissions(resource); - assertEquals("test1", permissions.getOwner().getName()); - assertEquals("users", permissions.getGroup().getName()); - assertEquals(0770, permissions.getMode()); + assertEquals("test1", permissions.getOwner().getName()); + assertEquals("users", permissions.getGroup().getName()); + assertEquals(0770, permissions.getMode()); + } + } + } } @Test public void copyCollection_doesPreservePermissionsOfSubCollections() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - - cms.copy(XmldbURI.create("/db/securityTest1"), XmldbURI.create("/db/securityTest3"), XmldbURI.create("copy-of-securityTest1")); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - final Collection testCopy = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3/copy-of-securityTest1", "test1", "test1"); + cms.copy(XmldbURI.create("/db/securityTest1"), XmldbURI.create("/db/securityTest3"), XmldbURI.create("copy-of-securityTest1")); - final Collection sub1 = testCopy.getChildCollection("sub1"); - final UserManagementService ums = sub1.getService(UserManagementService.class); - final Permission permissions = ums.getPermissions(sub1); + try (final Collection testCopy = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3/copy-of-securityTest1", "test1", "test1"); + final Collection sub1 = testCopy.getChildCollection("sub1")) { + final UserManagementService ums = sub1.getService(UserManagementService.class); + final Permission permissions = ums.getPermissions(sub1); - assertEquals("test1", permissions.getOwner().getName()); - assertEquals("users", permissions.getGroup().getName()); - assertEquals(0777, permissions.getMode()); + assertEquals("test1", permissions.getOwner().getName()); + assertEquals("users", permissions.getGroup().getName()); + assertEquals(0777, permissions.getMode()); + } + } } /** @@ -1338,38 +1489,43 @@ public void copyCollection_doesPreservePermissionsOfSubCollections() throws XMLD */ @Test public void copyCollectionWithResource_doesNotPreservePermissions() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create collection owned by "test1", and group "users" in /db/securityTest3 - Collection source = cms.createCollection("source"); + //create collection owned by "test1", and group "users" in /db/securityTest3 + try (final Collection source = cms.createCollection("source")) { - //create resource owned by "test1", and group "users" in /db/securityTest3/source - final Resource resSource = source.createResource("source.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); + //create resource owned by "test1", and group "users" in /db/securityTest3/source + try (final Resource resSource = source.createResource("source.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } + } + } //as the 'test3' user copy the collection - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3"); - cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); - + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); - UserManagementService ums = test.getService(UserManagementService.class); - final Collection copyOfSource = test.getChildCollection("copy-of-source"); - Permission permissions = ums.getPermissions(copyOfSource); + UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection copyOfSource = test.getChildCollection("copy-of-source")) { + Permission permissions = ums.getPermissions(copyOfSource); - //collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source - assertEquals("test3", permissions.getOwner().getName()); - assertEquals("guest", permissions.getGroup().getName()); + //collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source + assertEquals("test3", permissions.getOwner().getName()); + assertEquals("guest", permissions.getGroup().getName()); - ums = copyOfSource.getService(UserManagementService.class); - final Resource resCopyOfSource = copyOfSource.getResource("source.xml"); - permissions = ums.getPermissions(resCopyOfSource); + ums = copyOfSource.getService(UserManagementService.class); + try (final Resource resCopyOfSource = copyOfSource.getResource("source.xml")) { + permissions = ums.getPermissions(resCopyOfSource); - //resource in collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source.xml - assertEquals("test3", permissions.getOwner().getName()); - assertEquals("guest", permissions.getGroup().getName()); + //resource in collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source.xml + assertEquals("test3", permissions.getOwner().getName()); + assertEquals("guest", permissions.getGroup().getName()); + } + } + } } @@ -1390,73 +1546,85 @@ public void copyCollectionWithResource_doesNotPreservePermissions() throws XMLDB */ @Test public void copyCollectionWithResources_withSubCollectionWithResource_doesNotPreservePermissions() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create collection owned by "test1", and group "users" in /db/securityTest3 - Collection source = cms.createCollection("source"); + //create collection owned by "test1", and group "users" in /db/securityTest3 + try (final Collection source = cms.createCollection("source")) { - //create resource owned by "test1", and group "users" in /db/securityTest3/source - Resource resSource = source.createResource("source1.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); + //create resource owned by "test1", and group "users" in /db/securityTest3/source + try (final Resource resSource = source.createResource("source1.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } - resSource = source.createResource("source2.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); - - //create sub-collection "sub" owned by "test1", and group "users" in /db/securityTest3/source - CollectionManagementService cms1 = source.getService(CollectionManagementService.class); - Collection sub = cms1.createCollection("sub"); - - //create resource owned by "test1", and group "users" in /db/securityTest3/source/sub1 - Resource resSub = sub.createResource("sub1.xml", XMLResource.class); - resSub.setContent(""); - sub.storeResource(resSub); + try (final Resource resSource = source.createResource("source2.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } - //as the 'test3' user copy the collection - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3"); - cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); + //create sub-collection "sub" owned by "test1", and group "users" in /db/securityTest3/source + final CollectionManagementService cms1 = source.getService(CollectionManagementService.class); + try (final Collection sub = cms1.createCollection("sub")) { - final Collection copyOfSource = test.getChildCollection("copy-of-source"); - assertNotNull(copyOfSource); - assertEquals(2, copyOfSource.listResources().size()); - - final Collection copyOfSub = copyOfSource.getChildCollection("sub"); - assertNotNull(copyOfSub); - assertEquals(1, copyOfSub.listResources().size()); - - //collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source - UserManagementService ums = test.getService(UserManagementService.class); - Permission permissions = ums.getPermissions(copyOfSource); - assertEquals("test3", permissions.getOwner().getName()); - assertEquals("guest", permissions.getGroup().getName()); - - //resource in collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source/source1.xml - ums = copyOfSource.getService(UserManagementService.class); - final Resource resCopyOfSource1 = copyOfSource.getResource("source1.xml"); - permissions = ums.getPermissions(resCopyOfSource1); - assertEquals("test3", permissions.getOwner().getName()); - assertEquals("guest", permissions.getGroup().getName()); - - //resource in collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source/source2.xml - final Resource resCopyOfSource2 = copyOfSource.getResource("source2.xml"); - permissions = ums.getPermissions(resCopyOfSource2); - assertEquals("test3", permissions.getOwner().getName()); - assertEquals("guest", permissions.getGroup().getName()); - - //sub-collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source/sub - ums = copyOfSub.getService(UserManagementService.class); - permissions = ums.getPermissions(copyOfSub); - assertEquals("test3", permissions.getOwner().getName()); - assertEquals("guest", permissions.getGroup().getName()); - - //sub-collection/resource should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source/sub/sub1.xml - final Resource resCopyOfSub1 = copyOfSub.getResource("sub1.xml"); - permissions = ums.getPermissions(resCopyOfSub1); - assertEquals("test3", permissions.getOwner().getName()); - assertEquals("guest", permissions.getGroup().getName()); + //create resource owned by "test1", and group "users" in /db/securityTest3/source/sub1 + try (final Resource resSub = sub.createResource("sub1.xml", XMLResource.class)) { + resSub.setContent(""); + sub.storeResource(resSub); + } + } + } + } + + //as the 'test3' user copy the collection + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); + + try (final Collection copyOfSource = test.getChildCollection("copy-of-source")) { + assertNotNull(copyOfSource); + assertEquals(2, copyOfSource.listResources().size()); + + try (final Collection copyOfSub = copyOfSource.getChildCollection("sub")) { + assertNotNull(copyOfSub); + assertEquals(1, copyOfSub.listResources().size()); + + //collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source + UserManagementService ums = test.getService(UserManagementService.class); + Permission permissions = ums.getPermissions(copyOfSource); + assertEquals("test3", permissions.getOwner().getName()); + assertEquals("guest", permissions.getGroup().getName()); + + //resource in collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source/source1.xml + ums = copyOfSource.getService(UserManagementService.class); + try (final Resource resCopyOfSource1 = copyOfSource.getResource("source1.xml")) { + permissions = ums.getPermissions(resCopyOfSource1); + assertEquals("test3", permissions.getOwner().getName()); + assertEquals("guest", permissions.getGroup().getName()); + } + + //resource in collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source/source2.xml + try (final Resource resCopyOfSource2 = copyOfSource.getResource("source2.xml")) { + permissions = ums.getPermissions(resCopyOfSource2); + assertEquals("test3", permissions.getOwner().getName()); + assertEquals("guest", permissions.getGroup().getName()); + + //sub-collection should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source/sub + ums = copyOfSub.getService(UserManagementService.class); + permissions = ums.getPermissions(copyOfSub); + assertEquals("test3", permissions.getOwner().getName()); + assertEquals("guest", permissions.getGroup().getName()); + } + + //sub-collection/resource should be owned by test3:guest, i.e. permissions were not preserved from the test1 users doc /db/securityTest3/source/sub/sub1.xml + try (final Resource resCopyOfSub1 = copyOfSub.getResource("sub1.xml")) { + permissions = ums.getPermissions(resCopyOfSub1); + assertEquals("test3", permissions.getOwner().getName()); + assertEquals("guest", permissions.getGroup().getName()); + } + } + } + } } /** @@ -1488,424 +1656,506 @@ public void copyCollectionWithResources_withSubCollectionWithResource_doesNotPre */ @Test public void copyCollectionWithResources_destResourceExists_destResourceIsWritable_preservePermissions() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create collection owned by "test1", and group "users" in /db/securityTest3 - Collection source = cms.createCollection("source"); + //create collection owned by "test1", and group "users" in /db/securityTest3 + try (final Collection source = cms.createCollection("source")) { - //create resource owned by "test1", and group "users" in /db/securityTest3/source - Resource resSource = source.createResource("source1.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); + //create resource owned by "test1", and group "users" in /db/securityTest3/source + try (final Resource resSource = source.createResource("source1.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } + + try (final Resource resSource = source.createResource("source2.xml", XMLResource.class)) { + resSource.setContent(""); + source.storeResource(resSource); + } + } + + //pre-create the destination and set writable by all + try (final Collection dest = cms.createCollection("copy-of-source")) { + final UserManagementService ums = dest.getService(UserManagementService.class); + ums.chmod(0777); + + //pre-create a destination resource and set access for all + try (final Resource resDestSource1 = dest.createResource("source1.xml", XMLResource.class)) { + resDestSource1.setContent(""); + dest.storeResource(resDestSource1); + ums.chmod(resDestSource1, 0777); + } + } + } - resSource = source.createResource("source2.xml", XMLResource.class); - resSource.setContent(""); - source.storeResource(resSource); - - //pre-create the destination and set writable by all - final Collection dest = cms.createCollection("copy-of-source"); - UserManagementService ums = dest.getService(UserManagementService.class); - ums.chmod(0777); - - //pre-create a destination resource and set access for all - Resource resDestSource1 = dest.createResource("source1.xml", XMLResource.class); - resDestSource1.setContent(""); - dest.storeResource(resDestSource1); - ums.chmod(resDestSource1, 0777); - //as the 'test3' user copy the collection - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3"); - cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); - - final Collection copyOfSource = test.getChildCollection("copy-of-source"); - assertNotNull(copyOfSource); - assertEquals(2, copyOfSource.listResources().size()); - ums = copyOfSource.getService(UserManagementService.class); - - //permissions should NOT have changed as the dest already existed! - Permission permissions = ums.getPermissions(copyOfSource); - assertEquals("test1", permissions.getOwner().getName()); - assertEquals("users", permissions.getGroup().getName()); - - final Resource resCopyOfSource1 = copyOfSource.getResource("source1.xml"); - assertEquals("", resCopyOfSource1.getContent().toString()); - - //permissions should NOT have changed as the dest resource already existed! - permissions = ums.getPermissions(resCopyOfSource1); - assertEquals("test1", permissions.getOwner().getName()); - assertEquals("users", permissions.getGroup().getName()); - - final Resource resCopyOfSource2 = copyOfSource.getResource("source2.xml"); - assertEquals("", resCopyOfSource2.getContent().toString()); - - //permissions SHOULD have changed as the dest resource is did NOT exist - permissions = ums.getPermissions(resCopyOfSource2); - assertEquals("test3", permissions.getOwner().getName()); - assertEquals("guest", permissions.getGroup().getName()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest3", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copy("/db/securityTest3/source", "/db/securityTest3", "copy-of-source"); + + try (final Collection copyOfSource = test.getChildCollection("copy-of-source")) { + assertNotNull(copyOfSource); + assertEquals(2, copyOfSource.listResources().size()); + final UserManagementService ums = copyOfSource.getService(UserManagementService.class); + + //permissions should NOT have changed as the dest already existed! + Permission permissions = ums.getPermissions(copyOfSource); + assertEquals("test1", permissions.getOwner().getName()); + assertEquals("users", permissions.getGroup().getName()); + + try (final Resource resCopyOfSource1 = copyOfSource.getResource("source1.xml")) { + assertEquals("", resCopyOfSource1.getContent().toString()); + + //permissions should NOT have changed as the dest resource already existed! + permissions = ums.getPermissions(resCopyOfSource1); + assertEquals("test1", permissions.getOwner().getName()); + assertEquals("users", permissions.getGroup().getName()); + } + + try (final Resource resCopyOfSource2 = copyOfSource.getResource("source2.xml")) { + assertEquals("", resCopyOfSource2.getContent().toString()); + + //permissions SHOULD have changed as the dest resource is did NOT exist + permissions = ums.getPermissions(resCopyOfSource2); + assertEquals("test3", permissions.getOwner().getName()); + assertEquals("guest", permissions.getGroup().getName()); + } + } + } } @Test public void setUidXQueryCanWriteRestrictedCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - - final long timestamp = System.currentTimeMillis(); - final String content = "" + timestamp + ""; + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { - //create an XQuery /db/securityTest1/setuid.xquery - final String xquery = "xmldb:store('/db/securityTest1/forSetUidWrite', 'setuid.xml', " + content + ")"; - Resource xqueryResource = test.createResource("setuid.xquery", BinaryResource.class); - xqueryResource.setContent(xquery); - test.storeResource(xqueryResource); + final long timestamp = System.currentTimeMillis(); + final String content = "" + timestamp + ""; - //set the xquery to be owned by 'test1' and set it 'setuid', and set it 'rx' by 'users' group so 'test2' can execute it! - UserManagementService ums = test.getService(UserManagementService.class); - xqueryResource = test.getResource("setuid.xquery"); - ums.chmod(xqueryResource, 04750); - - //create a collection for the XQuery to write into - final CollectionManagementService cms = test.getService(CollectionManagementService.class); - final Collection colForSetUid = cms.createCollection("forSetUidWrite"); + //create an XQuery /db/securityTest1/setuid.xquery + final String xquery = "xmldb:store('/db/securityTest1/forSetUidWrite', 'setuid.xml', " + content + ")"; + try (final Resource xqueryResource = test.createResource("setuid.xquery", BinaryResource.class)) { + xqueryResource.setContent(xquery); + test.storeResource(xqueryResource); + } - //only allow the user 'test1' to write into the collection - ums = colForSetUid.getService(UserManagementService.class); - ums.chmod(0700); + //set the xquery to be owned by 'test1' and set it 'setuid', and set it 'rx' by 'users' group so 'test2' can execute it! + UserManagementService ums = test.getService(UserManagementService.class); + try (final Resource xqueryResource = test.getResource("setuid.xquery")) { + ums.chmod(xqueryResource, 04750); + } - //execute the XQuery as the 'test2' user... it should become 'setuid' of 'test1' and succeed. - final Collection test2 = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); - final EXistXPathQueryService queryService = test2.getService(EXistXPathQueryService.class); - final ResourceSet result = queryService.executeStoredQuery("/db/securityTest1/setuid.xquery"); - assertEquals("/db/securityTest1/forSetUidWrite/setuid.xml", result.getResource(0).getContent()); + //create a collection for the XQuery to write into + final CollectionManagementService cms = test.getService(CollectionManagementService.class); + try (final Collection colForSetUid = cms.createCollection("forSetUidWrite")) { + //only allow the user 'test1' to write into the collection + ums = colForSetUid.getService(UserManagementService.class); + ums.chmod(0700); + + //execute the XQuery as the 'test2' user... it should become 'setuid' of 'test1' and succeed. + try (final Collection test2 = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2")) { + final EXistXPathQueryService queryService = test2.getService(EXistXPathQueryService.class); + try (final EXistResourceSet result = queryService.executeStoredQuery("/db/securityTest1/setuid.xquery")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("/db/securityTest1/forSetUidWrite/setuid.xml", resource.getContent()); + } + } + } - //check the written content - final Resource writtenXmlResource = colForSetUid.getResource("setuid.xml"); - assertEquals(content, writtenXmlResource.getContent()); + //check the written content + try (final Resource writtenXmlResource = colForSetUid.getResource("setuid.xml")) { + assertEquals(content, writtenXmlResource.getContent()); + } + } + } } @Test(expected=XMLDBException.class) public void nonSetUidXQueryCannotWriteRestrictedCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - - final long timestamp = System.currentTimeMillis(); - final String content = "" + timestamp + ""; + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { - //create an XQuery /db/securityTest1/not_setuid.xquery - final String xquery = "xmldb:store('/db/securityTest1/forSetUidWrite', 'not_setuid.xml', " + content + ")"; - Resource xqueryResource = test.createResource("not_setuid.xquery", BinaryResource.class); - xqueryResource.setContent(xquery); - test.storeResource(xqueryResource); + final long timestamp = System.currentTimeMillis(); + final String content = "" + timestamp + ""; - //set the xquery to be owned by 'test1' and do NOT set it 'setuid', and do set it 'rx' by 'users' group so 'test2' can execute it! - UserManagementService ums = test.getService(UserManagementService.class); - xqueryResource = test.getResource("not_setuid.xquery"); - ums.chmod(xqueryResource, 00750); //NOT SETUID - - //create a collection for the XQuery to write into - final CollectionManagementService cms = test.getService(CollectionManagementService.class); - final Collection colForSetUid = cms.createCollection("forSetUidWrite"); + //create an XQuery /db/securityTest1/not_setuid.xquery + final String xquery = "xmldb:store('/db/securityTest1/forSetUidWrite', 'not_setuid.xml', " + content + ")"; + try (final Resource xqueryResource = test.createResource("not_setuid.xquery", BinaryResource.class)) { + xqueryResource.setContent(xquery); + test.storeResource(xqueryResource); + } - //only allow the user 'test1' to write into the collection - ums = colForSetUid.getService(UserManagementService.class); - ums.chmod(0700); + //set the xquery to be owned by 'test1' and do NOT set it 'setuid', and do set it 'rx' by 'users' group so 'test2' can execute it! + UserManagementService ums = test.getService(UserManagementService.class); + try (final Resource xqueryResource = test.getResource("not_setuid.xquery")) { + ums.chmod(xqueryResource, 00750); //NOT SETUID + } - //execute the XQuery as the 'test2' user... it should become 'setuid' of 'test1' and succeed. - final Collection test2 = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2"); - final EXistXPathQueryService queryService = test2.getService(EXistXPathQueryService.class); - final ResourceSet result = queryService.executeStoredQuery("/db/securityTest1/not_setuid.xquery"); - assertFalse("/db/securityTest1/forSetUidWrite/not_setuid.xml".equals(result.getResource(0).getContent())); + //create a collection for the XQuery to write into + final CollectionManagementService cms = test.getService(CollectionManagementService.class); + try (final Collection colForSetUid = cms.createCollection("forSetUidWrite")) { + + //only allow the user 'test1' to write into the collection + ums = colForSetUid.getService(UserManagementService.class); + ums.chmod(0700); + + //execute the XQuery as the 'test2' user... it should become 'setuid' of 'test1' and succeed. + try (final Collection test2 = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test2", "test2")) { + final EXistXPathQueryService queryService = test2.getService(EXistXPathQueryService.class); + try (final EXistResourceSet result = queryService.executeStoredQuery("/db/securityTest1/not_setuid.xquery")) { + try (final Resource resource = result.getResource(0)) { + assertFalse("/db/securityTest1/forSetUidWrite/not_setuid.xml".equals(resource.getContent())); + } + } + } + } + } } @Test public void setGidXQueryCanWriteRestrictedCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1"); - - final long timestamp = System.currentTimeMillis(); - final String content = "" + timestamp + ""; - - //create an XQuery /db/securityTest1/setuid.xquery - final String xquery = "xmldb:store('/db/securityTest2/forSetGidWrite', 'setgid.xml', " + content + ")"; - Resource xqueryResource = test.createResource("setgid.xquery", BinaryResource.class); - xqueryResource.setContent(xquery); - test.storeResource(xqueryResource); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1")) { - //set the xquery to be owned by 'test1':'users' and set it 'setgid', and set it 'rx' by ohers, so 'test3' can execute it! - UserManagementService ums = test.getService(UserManagementService.class); - xqueryResource = test.getResource("setgid.xquery"); - ums.chown(xqueryResource, ums.getAccount("test1"), "users"); - ums.chmod(xqueryResource, 02705); //setgid + final long timestamp = System.currentTimeMillis(); + final String content = "" + timestamp + ""; - //create a collection for the XQuery to write into - final CollectionManagementService cms = test.getService(CollectionManagementService.class); - final Collection colForSetUid = cms.createCollection("forSetGidWrite"); - - //only allow the group 'users' to write into the collection - ums = colForSetUid.getService(UserManagementService.class); - ums.chmod(0570); + //create an XQuery /db/securityTest1/setuid.xquery + final String xquery = "xmldb:store('/db/securityTest2/forSetGidWrite', 'setgid.xml', " + content + ")"; + try (final Resource xqueryResource = test.createResource("setgid.xquery", BinaryResource.class)) { + xqueryResource.setContent(xquery); + test.storeResource(xqueryResource); + } - //execute the XQuery as the 'test3' user... it should become 'setgid' of 'users' and succeed. - final Collection test3 = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test3", "test3"); - final EXistXPathQueryService queryService = test3.getService(EXistXPathQueryService.class); - final ResourceSet result = queryService.executeStoredQuery("/db/securityTest2/setgid.xquery"); - assertEquals("/db/securityTest2/forSetGidWrite/setgid.xml", result.getResource(0).getContent()); + //set the xquery to be owned by 'test1':'users' and set it 'setgid', and set it 'rx' by ohers, so 'test3' can execute it! + UserManagementService ums = test.getService(UserManagementService.class); + try (final Resource xqueryResource = test.getResource("setgid.xquery")) { + ums.chown(xqueryResource, ums.getAccount("test1"), "users"); + ums.chmod(xqueryResource, 02705); //setgid + } - //check the written content - final Resource writtenXmlResource = colForSetUid.getResource("setgid.xml"); - assertEquals(content, writtenXmlResource.getContent()); + //create a collection for the XQuery to write into + final CollectionManagementService cms = test.getService(CollectionManagementService.class); + try (final Collection colForSetUid = cms.createCollection("forSetGidWrite")) { + + //only allow the group 'users' to write into the collection + ums = colForSetUid.getService(UserManagementService.class); + ums.chmod(0570); + + //execute the XQuery as the 'test3' user... it should become 'setgid' of 'users' and succeed. + try (final Collection test3 = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test3", "test3")) { + final EXistXPathQueryService queryService = test3.getService(EXistXPathQueryService.class); + try (final EXistResourceSet result = queryService.executeStoredQuery("/db/securityTest2/setgid.xquery")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("/db/securityTest2/forSetGidWrite/setgid.xml", resource.getContent()); + } + } + + //check the written content + try (final Resource writtenXmlResource = colForSetUid.getResource("setgid.xml")) { + assertEquals(content, writtenXmlResource.getContent()); + } + } + } + } } @Test(expected=XMLDBException.class) public void nonSetGidXQueryCannotWriteRestrictedCollection() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1"); - - final long timestamp = System.currentTimeMillis(); - final String content = "" + timestamp + ""; + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1")) { - //create an XQuery /db/securityTest1/not_setgid.xquery - final String xquery = "xmldb:store('/db/securityTest2/forSetGidWrite', 'not_setgid.xml', " + content + ")"; - Resource xqueryResource = test.createResource("not_setgid.xquery", BinaryResource.class); - xqueryResource.setContent(xquery); - test.storeResource(xqueryResource); + final long timestamp = System.currentTimeMillis(); + final String content = "" + timestamp + ""; - //set the xquery to be owned by 'test1':'users' and set it 'setgid', and set it 'rx' by ohers, so 'test3' can execute it! - UserManagementService ums = test.getService(UserManagementService.class); - xqueryResource = test.getResource("not_setgid.xquery"); - ums.chmod(xqueryResource, 00705); //NOT setgid - - //create a collection for the XQuery to write into - final CollectionManagementService cms = test.getService(CollectionManagementService.class); - final Collection colForSetUid = cms.createCollection("forSetGidWrite"); + //create an XQuery /db/securityTest1/not_setgid.xquery + final String xquery = "xmldb:store('/db/securityTest2/forSetGidWrite', 'not_setgid.xml', " + content + ")"; + try (final Resource xqueryResource = test.createResource("not_setgid.xquery", BinaryResource.class)) { + xqueryResource.setContent(xquery); + test.storeResource(xqueryResource); + } - //only allow the group 'users' to write into the collection - ums = colForSetUid.getService(UserManagementService.class); - ums.chmod(0070); + //set the xquery to be owned by 'test1':'users' and set it 'setgid', and set it 'rx' by ohers, so 'test3' can execute it! + UserManagementService ums = test.getService(UserManagementService.class); + try (final Resource xqueryResource = test.getResource("not_setgid.xquery")) { + ums.chmod(xqueryResource, 00705); //NOT setgid + } - //execute the XQuery as the 'test3' user... it should become 'setgid' of 'users' and succeed. - final Collection test3 = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test3", "test3"); - final EXistXPathQueryService queryService = test3.getService(EXistXPathQueryService.class); - final ResourceSet result = queryService.executeStoredQuery("/db/securityTest2/not_setgid.xquery"); - assertFalse("/db/securityTest2/forSetGidWrite/not_setgid.xml".equals(result.getResource(0).getContent())); + //create a collection for the XQuery to write into + final CollectionManagementService cms = test.getService(CollectionManagementService.class); + try (final Collection colForSetUid = cms.createCollection("forSetGidWrite")) { + + //only allow the group 'users' to write into the collection + ums = colForSetUid.getService(UserManagementService.class); + ums.chmod(0070); + + //execute the XQuery as the 'test3' user... it should become 'setgid' of 'users' and succeed. + try (final Collection test3 = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test3", "test3")) { + final EXistXPathQueryService queryService = test3.getService(EXistXPathQueryService.class); + try (final EXistResourceSet result = queryService.executeStoredQuery("/db/securityTest2/not_setgid.xquery")) { + try (final Resource resource = result.getResource(0)) { + assertFalse("/db/securityTest2/forSetGidWrite/not_setgid.xml".equals(resource.getContent())); + } + } + } + } + } } @Test public void noSetGid_createSubCollection_subCollectionGroupIsUsersPrimaryGroup() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1"); - CollectionManagementService cms = test.getService(CollectionManagementService.class); - - //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxr--rwx" - Collection parentCollection = cms.createCollection("parentCollection"); - UserManagementService ums = parentCollection.getService(UserManagementService.class); - ums.chmod("rwxr--rwx"); - - //now create the sub-collection /db/securityTest2/parentCollection/subCollection1 - //as "user3:guest", it should have it's group set to the primary group of user3 i.e. 'guest' - //as the collection is NOT setUid and it should NOT have the setGid bit set - parentCollection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2/parentCollection", "test3", "test3"); - ums = parentCollection.getService(UserManagementService.class); - cms = parentCollection.getService(CollectionManagementService.class); - final Collection subCollection = cms.createCollection("subCollection1"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1")) { + CollectionManagementService cms = test.getService(CollectionManagementService.class); + + UserManagementService ums; + //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxr--rwx" + try (final Collection parentCollection = cms.createCollection("parentCollection")) { + ums = parentCollection.getService(UserManagementService.class); + ums.chmod("rwxr--rwx"); + } - final Permission permissions = ums.getPermissions(subCollection); - assertEquals("guest", permissions.getGroup().getName()); - assertFalse(permissions.isSetGid()); + //now create the sub-collection /db/securityTest2/parentCollection/subCollection1 + //as "user3:guest", it should have it's group set to the primary group of user3 i.e. 'guest' + //as the collection is NOT setUid and it should NOT have the setGid bit set + try (final Collection parentCollection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2/parentCollection", "test3", "test3")) { + ums = parentCollection.getService(UserManagementService.class); + cms = parentCollection.getService(CollectionManagementService.class); + try (final Collection subCollection = cms.createCollection("subCollection1")) { + + final Permission permissions = ums.getPermissions(subCollection); + assertEquals("guest", permissions.getGroup().getName()); + assertFalse(permissions.isSetGid()); + } + } + } } @Test public void setGid_createSubCollection_subCollectionGroupInheritedFromParent() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1"); - CollectionManagementService cms = test.getService(CollectionManagementService.class); - - //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwsrwx" - Collection parentCollection = cms.createCollection("parentCollection"); - UserManagementService ums = parentCollection.getService(UserManagementService.class); - ums.chmod("rwxrwsrwx"); - - //now create the sub-collection /db/securityTest2/parentCollection/subCollection1 - //it should inherit the group ownership 'users' from the parent collection which is setGid - //and it should inherit the setGid bit - parentCollection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2/parentCollection", "test3", "test3"); - ums = parentCollection.getService(UserManagementService.class); - cms = parentCollection.getService(CollectionManagementService.class); - final Collection subCollection = cms.createCollection("subCollection1"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1")) { + CollectionManagementService cms = test.getService(CollectionManagementService.class); + + //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwsrwx" + UserManagementService ums; + try (final Collection parentCollection = cms.createCollection("parentCollection")) { + ums = parentCollection.getService(UserManagementService.class); + ums.chmod("rwxrwsrwx"); + } - final Permission permissions = ums.getPermissions(subCollection); - assertEquals("users", permissions.getGroup().getName()); - assertTrue(permissions.isSetGid()); + //now create the sub-collection /db/securityTest2/parentCollection/subCollection1 + //it should inherit the group ownership 'users' from the parent collection which is setGid + //and it should inherit the setGid bit + try (final Collection parentCollection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2/parentCollection", "test3", "test3")) { + ums = parentCollection.getService(UserManagementService.class); + cms = parentCollection.getService(CollectionManagementService.class); + try (final Collection subCollection = cms.createCollection("subCollection1")) { + + final Permission permissions = ums.getPermissions(subCollection); + assertEquals("users", permissions.getGroup().getName()); + assertTrue(permissions.isSetGid()); + } + } + } } @Test public void noSetGid_createResource_resourceGroupIsUsersPrimaryGroup() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1"); - CollectionManagementService cms = test.getService(CollectionManagementService.class); - - //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwxrwx" - Collection parentCollection = cms.createCollection("parentCollection"); - UserManagementService ums = parentCollection.getService(UserManagementService.class); - ums.chmod("rwxrwxrwx"); - - //now create the sub-resource /db/securityTest2/parentCollection/test.xml - //as "user3:guest", it should have it's group set to the primary group of user3 i.e. 'guest' - //as the collection is NOT setGid, the file should NOT have the setGid bit set - parentCollection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2/parentCollection", "test3", "test3"); - ums = parentCollection.getService(UserManagementService.class); - Resource resource = parentCollection.createResource("test.xml", XMLResource.class); - resource.setContent(""); - parentCollection.storeResource(resource); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1")) { + CollectionManagementService cms = test.getService(CollectionManagementService.class); + + UserManagementService ums; + //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwxrwx" + try (final Collection parentCollection = cms.createCollection("parentCollection")) { + ums = parentCollection.getService(UserManagementService.class); + ums.chmod("rwxrwxrwx"); + } - final Permission permissions = ums.getPermissions(resource); - assertEquals("guest", permissions.getGroup().getName()); - assertFalse(permissions.isSetGid()); + //now create the sub-resource /db/securityTest2/parentCollection/test.xml + //as "user3:guest", it should have it's group set to the primary group of user3 i.e. 'guest' + //as the collection is NOT setGid, the file should NOT have the setGid bit set + try (final Collection parentCollection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2/parentCollection", "test3", "test3")) { + ums = parentCollection.getService(UserManagementService.class); + try (final Resource resource = parentCollection.createResource("test.xml", XMLResource.class)) { + resource.setContent(""); + parentCollection.storeResource(resource); + + final Permission permissions = ums.getPermissions(resource); + assertEquals("guest", permissions.getGroup().getName()); + assertFalse(permissions.isSetGid()); + } + } + } } @Test public void setGid_createResource_resourceGroupInheritedFromParent() throws XMLDBException { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1"); - CollectionManagementService cms = test.getService(CollectionManagementService.class); - - //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwsrwx" - Collection parentCollection = cms.createCollection("parentCollection"); - UserManagementService ums = parentCollection.getService(UserManagementService.class); - ums.chmod("rwxrwsrwx"); - - //now as "test3:guest" create the sub-resource /db/securityTest2/parentCollection/test.xml - //it should inherit the group ownership 'users' from the parent which is setGid - //but it should not inherit the setGid bit as it is a resource - parentCollection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2/parentCollection", "test3", "test3"); - ums = parentCollection.getService(UserManagementService.class); - Resource resource = parentCollection.createResource("test.xml", XMLResource.class); - resource.setContent(""); - parentCollection.storeResource(resource); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1")) { + CollectionManagementService cms = test.getService(CollectionManagementService.class); + + UserManagementService ums; + //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwsrwx" + try (final Collection parentCollection = cms.createCollection("parentCollection")) { + ums = parentCollection.getService(UserManagementService.class); + ums.chmod("rwxrwsrwx"); + } - final Permission permissions = ums.getPermissions(resource); - assertEquals("users", permissions.getGroup().getName()); - assertFalse(permissions.isSetGid()); + //now as "test3:guest" create the sub-resource /db/securityTest2/parentCollection/test.xml + //it should inherit the group ownership 'users' from the parent which is setGid + //but it should not inherit the setGid bit as it is a resource + try (final Collection parentCollection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2/parentCollection", "test3", "test3")) { + ums = parentCollection.getService(UserManagementService.class); + try (final Resource resource = parentCollection.createResource("test.xml", XMLResource.class)) { + resource.setContent(""); + parentCollection.storeResource(resource); + + final Permission permissions = ums.getPermissions(resource); + assertEquals("users", permissions.getGroup().getName()); + assertFalse(permissions.isSetGid()); + } + } + } } @Test public void noSetGid_copyCollection_collectionGroupIsUsersPrimaryGroup() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService)test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create the /db/securityTest2/src collection - Collection srcCollection = cms.createCollection("src"); + //create the /db/securityTest2/src collection + try (final Collection srcCollection = cms.createCollection("src")) { + // needed to ensure that srcCollection is closed + } - //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwxrwx" - Collection parentCollection = cms.createCollection("parentCollection"); - UserManagementService ums = parentCollection.getService(UserManagementService.class); - ums.chmod("rwxrwxrwx"); + //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwxrwx" + try (final Collection parentCollection = cms.createCollection("parentCollection")) { + final UserManagementService ums = parentCollection.getService(UserManagementService.class); + ums.chmod("rwxrwxrwx"); + } + } //now copy /db/securityTest2/src to /db/securityTest2/parentCollection/src //as "user3:guest", it should have it's group set to the primary group of "user3" i.e. 'guest' //as the collection is NOT setGid and it should NOT have it's setGid bit set - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test3", "test3"); - cms = (EXistCollectionManagementService)test.getService(CollectionManagementService.class); - cms.copy("src", "/db/securityTest2/parentCollection", "src"); - parentCollection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2/parentCollection", "test3", "test3"); - ums = parentCollection.getService(UserManagementService.class); - - srcCollection = test.getChildCollection("src"); - final Collection destCollection = parentCollection.getChildCollection("src"); - - final Permission permissions = ums.getPermissions(destCollection); - assertEquals("guest", permissions.getGroup().getName()); - assertFalse(permissions.isSetGid()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copy("src", "/db/securityTest2/parentCollection", "src"); + try (final Collection parentCollection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2/parentCollection", "test3", "test3")) { + final UserManagementService ums = parentCollection.getService(UserManagementService.class); + + try (final Collection srcCollection = test.getChildCollection("src"); + final Collection destCollection = parentCollection.getChildCollection("src")) { + + final Permission permissions = ums.getPermissions(destCollection); + assertEquals("guest", permissions.getGroup().getName()); + assertFalse(permissions.isSetGid()); + } + } + } } @Test public void setGid_copyCollection_collectionGroupInheritedFromParent() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService)test.getService(CollectionManagementService.class); - UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create the /db/securityTest2/src collection with owner "test1:extusers" and default mode - Collection srcCollection = cms.createCollection("src"); - ums = srcCollection.getService(UserManagementService.class); - ums.chgrp("extusers"); + //create the /db/securityTest2/src collection with owner "test1:extusers" and default mode + try (final Collection srcCollection = cms.createCollection("src")) { + final UserManagementService ums = srcCollection.getService(UserManagementService.class); + ums.chgrp("extusers"); + } - //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwsrwx" - Collection parentCollection = cms.createCollection("parentCollection"); - ums = parentCollection.getService(UserManagementService.class); - ums.chmod("rwxrwsrwx"); + //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwsrwx" + try (final Collection parentCollection = cms.createCollection("parentCollection")) { + final UserManagementService ums = parentCollection.getService(UserManagementService.class); + ums.chmod("rwxrwsrwx"); + } + } //now copy /db/securityTest2/src to /db/securityTest2/parentCollection/src //as "user3:guest", it should inherit the group ownership 'users' from the parent //collection which is setGid and it should have its setGid bit set - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test3", "test3"); - cms = (EXistCollectionManagementService)test.getService(CollectionManagementService.class); - cms.copy("src", "/db/securityTest2/parentCollection", "src"); - parentCollection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2/parentCollection", "test3", "test3"); - ums = parentCollection.getService(UserManagementService.class); - - final Collection destCollection = parentCollection.getChildCollection("src"); - - final Permission permissions = ums.getPermissions(destCollection); - assertEquals("users", permissions.getGroup().getName()); - assertTrue(permissions.isSetGid()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copy("src", "/db/securityTest2/parentCollection", "src"); + try (final Collection parentCollection = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2/parentCollection", "test3", "test3")) { + final UserManagementService ums = parentCollection.getService(UserManagementService.class); + + try (final Collection destCollection = parentCollection.getChildCollection("src")) { + final Permission permissions = ums.getPermissions(destCollection); + assertEquals("users", permissions.getGroup().getName()); + assertTrue(permissions.isSetGid()); + } + } + } } - @Test public void noSetGid_copyResource_resourceGroupIsUsersPrimaryGroup() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService)test.getService(CollectionManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); - //create the /db/securityTest2/test.xml resource - Resource resource = test.createResource("test.xml", XMLResource.class); - resource.setContent(""); - test.storeResource(resource); + //create the /db/securityTest2/test.xml resource + try (final Resource resource = test.createResource("test.xml", XMLResource.class)) { + resource.setContent(""); + test.storeResource(resource); + } - //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwxrwx" - Collection parentCollection = cms.createCollection("parentCollection"); - UserManagementService ums = parentCollection.getService(UserManagementService.class); - ums.chmod("rwxrwxrwx"); + //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwxrwx" + try (final Collection parentCollection = cms.createCollection("parentCollection")) { + final UserManagementService ums = parentCollection.getService(UserManagementService.class); + ums.chmod("rwxrwxrwx"); + } + } //now copy /db/securityTest2/test.xml to /db/securityTest2/parentCollection/test.xml //as user3, it should have it's group set to the primary group of user3 i.e. 'guest' //as the collection is NOT setGid and it should not have the setGid bit - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test3", "test3"); - cms = (EXistCollectionManagementService)test.getService(CollectionManagementService.class); - cms.copyResource("test.xml", "/db/securityTest2/parentCollection", "test.xml"); - ums = parentCollection.getService(UserManagementService.class); - - parentCollection = test.getChildCollection("parentCollection"); - resource = parentCollection.getResource("test.xml"); - - final Permission permissions = ums.getPermissions(resource); - assertEquals("guest", permissions.getGroup().getName()); - assertFalse(permissions.isSetGid()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copyResource("test.xml", "/db/securityTest2/parentCollection", "test.xml"); + + try (final Collection parentCollection = test.getChildCollection("parentCollection"); + final Resource resource = parentCollection.getResource("test.xml")) { + final UserManagementService ums = parentCollection.getService(UserManagementService.class); + final Permission permissions = ums.getPermissions(resource); + assertEquals("guest", permissions.getGroup().getName()); + assertFalse(permissions.isSetGid()); + } + } } @Test public void setGid_copyResource_resourceGroupInheritedFromParent() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1"); - EXistCollectionManagementService cms = (EXistCollectionManagementService)test.getService(CollectionManagementService.class); - UserManagementService ums = test.getService(UserManagementService.class); - - //create the /db/securityTest2/test.xml resource - Resource resource = test.createResource("test.xml", XMLResource.class); - resource.setContent(""); - test.storeResource(resource); - ums.chgrp(resource, "extusers"); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test1", "test1")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + UserManagementService ums = test.getService(UserManagementService.class); + + //create the /db/securityTest2/test.xml resource + try (final Resource resource = test.createResource("test.xml", XMLResource.class)) { + resource.setContent(""); + test.storeResource(resource); + ums.chgrp(resource, "extusers"); + } - //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwsrwx" - Collection parentCollection = cms.createCollection("parentCollection"); - ums = parentCollection.getService(UserManagementService.class); - ums.chmod("rwxrwsrwx"); + //create /db/securityTest2/parentCollection with owner "test1:users" and mode "rwxrwsrwx" + try (final Collection parentCollection = cms.createCollection("parentCollection")) { + ums = parentCollection.getService(UserManagementService.class); + ums.chmod("rwxrwsrwx"); + } + } //now copy /db/securityTest2/test.xml to /db/securityTest2/parentCollection/test.xml //as "user3:guest", it should inherit the group ownership 'users' from the parent collection which is setGid //and it should NOT have its setGid bit set as it is a resource - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test3", "test3"); - cms = (EXistCollectionManagementService)test.getService(CollectionManagementService.class); - cms.copyResource("test.xml", "/db/securityTest2/parentCollection", "test.xml"); - ums = parentCollection.getService(UserManagementService.class); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest2", "test3", "test3")) { + final EXistCollectionManagementService cms = (EXistCollectionManagementService) test.getService(CollectionManagementService.class); + cms.copyResource("test.xml", "/db/securityTest2/parentCollection", "test.xml"); - parentCollection = test.getChildCollection("parentCollection"); - resource = parentCollection.getResource("test.xml"); + try (final Collection parentCollection = test.getChildCollection("parentCollection"); + final Resource resource = parentCollection.getResource("test.xml")) { - final Permission permissions = ums.getPermissions(resource); - assertEquals("users", permissions.getGroup().getName()); - assertFalse(permissions.isSetGid()); + final UserManagementService ums = parentCollection.getService(UserManagementService.class); + final Permission permissions = ums.getPermissions(resource); + assertEquals("users", permissions.getGroup().getName()); + assertFalse(permissions.isSetGid()); + } + } } @@ -1929,122 +2179,138 @@ public void setGid_copyResource_resourceGroupInheritedFromParent() throws XMLDBE */ @Before public void setup() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - UserManagementService ums = root.getService(UserManagementService.class); - - ums.chmod("rwxr-xr-x"); //ensure /db is always 755 - - //remove accounts 'test1', 'test2' and 'test3' - removeAccounts(ums, new String[]{"test1", "test2", "test3"}); - - //remove group 'users' - removeGroups(ums, new String[]{"users"}); - - final Group group = new GroupAider("exist", "users"); - ums.addGroup(group); - - UserAider user = new UserAider("test1", group); - user.setPassword("test1"); - ums.addAccount(user); - - final Group extGroup = new GroupAider("exist", "extusers"); - ums.addGroup(extGroup); - ums.addAccountToGroup("test1", "extusers"); - - user = new UserAider("test2", group); - user.setPassword("test2"); - ums.addAccount(user); - - final Group test2OnlyGroup = new GroupAider("exist", "test2-only"); - ums.addGroup(test2OnlyGroup); - ums.addAccountToGroup("test2", "test2-only"); - - user = new UserAider("test3", ums.getGroup("guest")); - user.setPassword("test3"); - ums.addAccount(user); - - // create a collection /db/securityTest1 as owned by "test1:users" and mode 0770 - CollectionManagementService cms = root.getService(CollectionManagementService.class); - Collection test = cms.createCollection("securityTest1"); - ums = test.getService(UserManagementService.class); - //change ownership to test1 - final Account test1 = ums.getAccount("test1"); - ums.chown(test1, "users"); - // full permissions for user and group, none for world - ums.chmod(0770); - - test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1"); - - // create a resource /db/securityTest1/test.xml owned by "test1:users" and mode 0770 - Resource resource = test.createResource("test.xml", XMLResource.class); - resource.setContent(""); - test.storeResource(resource); - ums.chmod(resource, 0770); - - resource = test.createResource("test.bin", BinaryResource.class); - resource.setContent("binary-test".getBytes()); - test.storeResource(resource); - ums.chmod(resource, 0770); - - // create a collection /db/securityTest2 as user "test1" - cms = root.getService(CollectionManagementService.class); - Collection testCol2 = cms.createCollection("securityTest2"); - ums = testCol2.getService(UserManagementService.class); - //change ownership to test1 - ums.chown(test1, "users"); - // full permissions for user and group, none for world - ums.chmod(0775); - - // create a collection /db/securityTest3 as user "test3" - cms = root.getService(CollectionManagementService.class); - Collection testCol3 = cms.createCollection("securityTest3"); - ums = testCol3.getService(UserManagementService.class); - //change ownership to test3 - final Account test3 = ums.getAccount("test3"); - ums.chown(test3, "users"); - // full permissions for all - ums.chmod(0777); - - // create a sub-collection /db/securityTest1/sub1 as user "test1" - cms = test.getService(CollectionManagementService.class); - Collection sub1 = cms.createCollection("sub1"); - ums = sub1.getService(UserManagementService.class); - //change ownership to test1 - ums.chown(test1, "users"); - // full permissions for all - ums.chmod(0777); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final UserManagementService rootUms = root.getService(UserManagementService.class); + + rootUms.chmod("rwxr-xr-x"); //ensure /db is always 755 + + //remove accounts 'test1', 'test2' and 'test3' + removeAccounts(rootUms, new String[]{"test1", "test2", "test3"}); + + //remove group 'users' + removeGroups(rootUms, new String[]{"users"}); + + final Group group = new GroupAider("exist", "users"); + rootUms.addGroup(group); + + UserAider user = new UserAider("test1", group); + user.setPassword("test1"); + rootUms.addAccount(user); + + final Group extGroup = new GroupAider("exist", "extusers"); + rootUms.addGroup(extGroup); + rootUms.addAccountToGroup("test1", "extusers"); + + user = new UserAider("test2", group); + user.setPassword("test2"); + rootUms.addAccount(user); + + final Group test2OnlyGroup = new GroupAider("exist", "test2-only"); + rootUms.addGroup(test2OnlyGroup); + rootUms.addAccountToGroup("test2", "test2-only"); + + final Group guestGroup = rootUms.getGroup("guest"); + user = new UserAider("test3", guestGroup); + user.setPassword("test3"); + rootUms.addAccount(user); + + // create a collection /db/securityTest1 as owned by "test1:users" and mode 0770 + CollectionManagementService cms = root.getService(CollectionManagementService.class); + try (final Collection test = cms.createCollection("securityTest1")) { + final UserManagementService securityTest1Ums = test.getService(UserManagementService.class); + //change ownership to test1 + final Account test1 = securityTest1Ums.getAccount("test1"); + securityTest1Ums.chown(test1, "users"); + // full permissions for user and group, none for world + securityTest1Ums.chmod(0770); + } + + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/securityTest1", "test1", "test1")) { + final UserManagementService testUms = test.getService(UserManagementService.class); + + // create a resource /db/securityTest1/test.xml owned by "test1:users" and mode 0770 + try (final Resource resource = test.createResource("test.xml", XMLResource.class)) { + resource.setContent(""); + test.storeResource(resource); + testUms.chmod(resource, 0770); + } + + try (final Resource resource = test.createResource("test.bin", BinaryResource.class)) { + resource.setContent("binary-test".getBytes()); + test.storeResource(resource); + testUms.chmod(resource, 0770); + } + + // create a collection /db/securityTest2 as user "test1" + cms = root.getService(CollectionManagementService.class); + try (final Collection testCol2 = cms.createCollection("securityTest2")) { + final UserManagementService testCol2Ums = testCol2.getService(UserManagementService.class); + //change ownership to test1 + final Account test1 = testCol2Ums.getAccount("test1"); + testCol2Ums.chown(test1, "users"); + // full permissions for user and group, none for world + testCol2Ums.chmod(0775); + } + + // create a collection /db/securityTest3 as user "test3" + cms = root.getService(CollectionManagementService.class); + try (final Collection testCol3 = cms.createCollection("securityTest3")) { + final UserManagementService testCol3Ums = testCol3.getService(UserManagementService.class); + //change ownership to test3 + final Account test3 = testCol3Ums.getAccount("test3"); + testCol3Ums.chown(test3, "users"); + // full permissions for all + testCol3Ums.chmod(0777); + } + + // create a sub-collection /db/securityTest1/sub1 as user "test1" + cms = test.getService(CollectionManagementService.class); + try (final Collection sub1 = cms.createCollection("sub1")) { + final UserManagementService sub1Ums = sub1.getService(UserManagementService.class); + //change ownership to test1 + final Account test1 = sub1Ums.getAccount("test1"); + sub1Ums.chown(test1, "users"); + // full permissions for all + sub1Ums.chmod(0777); + } + } + } } @After public void cleanup() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", "admin", ""); - final CollectionManagementService cms = root.getService(CollectionManagementService.class); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService cms = root.getService(CollectionManagementService.class); - final Collection secTest1 = root.getChildCollection("securityTest1"); - if(secTest1 != null) { - secTest1.close(); - cms.removeCollection("securityTest1"); - } + try (final Collection secTest1 = root.getChildCollection("securityTest1")) { + if (secTest1 != null) { + secTest1.close(); + cms.removeCollection("securityTest1"); + } + } - final Collection secTest2 = root.getChildCollection("securityTest2"); - if(secTest2 != null) { - secTest2.close(); - cms.removeCollection("securityTest2"); - } + try (final Collection secTest2 = root.getChildCollection("securityTest2")) { + if (secTest2 != null) { + secTest2.close(); + cms.removeCollection("securityTest2"); + } + } - final Collection secTest3 = root.getChildCollection("securityTest3"); - if(secTest3 != null) { - secTest3.close(); - cms.removeCollection("securityTest3"); - } + try (final Collection secTest3 = root.getChildCollection("securityTest3")) { + if (secTest3 != null) { + secTest3.close(); + cms.removeCollection("securityTest3"); + } + } - final UserManagementService ums = root.getService(UserManagementService.class); + final UserManagementService ums = root.getService(UserManagementService.class); - //remove accounts 'test1', 'test2' and 'test3' - removeAccounts(ums, new String[]{"test1", "test2", "test3"}); + //remove accounts 'test1', 'test2' and 'test3' + removeAccounts(ums, new String[]{"test1", "test2", "test3"}); - //remove group 'users', 'extusers', 'test2-only' - removeGroups(ums, new String[]{"users", "extusers", "test2-only"}); + //remove group 'users', 'extusers', 'test2-only' + removeGroups(ums, new String[]{"users", "extusers", "test2-only"}); + } } private void removeAccounts(final UserManagementService ums, final String[] accountNames) throws XMLDBException { diff --git a/exist-core/src/test/java/org/exist/security/XmldbApiSecurityTest.java b/exist-core/src/test/java/org/exist/security/XmldbApiSecurityTest.java index 82091afe7a..30a9859d61 100644 --- a/exist-core/src/test/java/org/exist/security/XmldbApiSecurityTest.java +++ b/exist-core/src/test/java/org/exist/security/XmldbApiSecurityTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -79,7 +103,7 @@ protected void createCol(final String collectionName, final String uid, final St try { col = DatabaseManager.getCollection(getBaseUri() + "/db", uid, pwd); CollectionManagementService cms = col.getService(CollectionManagementService.class); - cms.createCollection(collectionName); + try (final Collection created = cms.createCollection(collectionName)) { } } catch(final XMLDBException xmldbe) { throw new ApiException(xmldbe); } finally { @@ -164,48 +188,23 @@ protected void chmodCol(final String collectionUri, final String mode, final Str @Override protected void chownRes(final String resourceUri, final String owner_uid, final String group_gid, final String uid, final String pwd) throws ApiException { - - Collection col = null; - try { - col = DatabaseManager.getCollection(getBaseUri() + getCollectionUri(resourceUri), uid, pwd); - - final Resource resource = col.getResource(getResourceName(resourceUri)); + try (final Collection col = DatabaseManager.getCollection(getBaseUri() + getCollectionUri(resourceUri), uid, pwd); + final Resource resource = col.getResource(getResourceName(resourceUri))) { final UserManagementService ums = col.getService(UserManagementService.class); - ums.chown(resource, ums.getAccount(owner_uid), group_gid); } catch(final XMLDBException xmldbe) { throw new ApiException(xmldbe); - } finally { - if(col != null) { - try { - col.close(); - } catch (final XMLDBException xmldbe) { - throw new ApiException(xmldbe); - } - } } } @Override protected void chmodRes(final String resourceUri, final String mode, final String uid, final String pwd) throws ApiException { - - Collection col = null; - try { - col = DatabaseManager.getCollection(getBaseUri() + getCollectionUri(resourceUri), uid, pwd); - - final Resource resource = col.getResource(getResourceName(resourceUri)); + try (final Collection col = DatabaseManager.getCollection(getBaseUri() + getCollectionUri(resourceUri), uid, pwd); + final Resource resource = col.getResource(getResourceName(resourceUri))) { final UserManagementService ums = col.getService(UserManagementService.class); ums.chmod(resource, mode); } catch(final XMLDBException xmldbe) { throw new ApiException(xmldbe); - } finally { - if(col != null) { - try { - col.close(); - } catch (final XMLDBException xmldbe) { - throw new ApiException(xmldbe); - } - } } } @@ -251,30 +250,17 @@ protected void addCollectionUserAce(final String collectionUri, final String use @Override protected String getXmlResourceContent(final String resourceUri, final String uid, final String pwd) throws ApiException { - - Collection col = null; - try { - col = DatabaseManager.getCollection(getBaseUri() + getCollectionUri(resourceUri), uid, pwd); - final Resource resource = col.getResource(getResourceName(resourceUri)); + try (final Collection col = DatabaseManager.getCollection(getBaseUri() + getCollectionUri(resourceUri), uid, pwd); + final Resource resource = col.getResource(getResourceName(resourceUri))) { return (String)resource.getContent(); } catch(final XMLDBException xmldbe) { throw new ApiException(xmldbe); - } finally { - if(col != null) { - try { - col.close(); - } catch (final XMLDBException xmldbe) { - throw new ApiException(xmldbe); - } - } } } @Override protected void removeAccount(final String account_uid, final String uid, final String pwd) throws ApiException { - Collection col = null; - try { - col = DatabaseManager.getCollection(getBaseUri() + "/db", uid, pwd); + try (final Collection col = DatabaseManager.getCollection(getBaseUri() + "/db", uid, pwd);) { final UserManagementService ums = col.getService(UserManagementService.class); final Account acct = ums.getAccount(account_uid); @@ -283,22 +269,12 @@ protected void removeAccount(final String account_uid, final String uid, final S } } catch(final XMLDBException xmldbe) { throw new ApiException(xmldbe); - } finally { - if(col != null) { - try { - col.close(); - } catch (final XMLDBException xmldbe) { - throw new ApiException(xmldbe); - } - } } } @Override protected void removeGroup(String group_uid, String uid, String pwd) throws ApiException { - Collection col = null; - try { - col = DatabaseManager.getCollection(getBaseUri() + "/db", uid, pwd); + try (final Collection col = DatabaseManager.getCollection(getBaseUri() + "/db", uid, pwd)) { final UserManagementService ums = col.getService(UserManagementService.class); final Group grp = ums.getGroup(group_uid); @@ -307,22 +283,12 @@ protected void removeGroup(String group_uid, String uid, String pwd) throws ApiE } } catch(final XMLDBException xmldbe) { throw new ApiException(xmldbe); - } finally { - if(col != null) { - try { - col.close(); - } catch (final XMLDBException xmldbe) { - throw new ApiException(xmldbe); - } - } } } @Override protected void createAccount(String account_uid, String account_pwd, String group_uid, String uid, String pwd) throws ApiException { - Collection col = null; - try { - col = DatabaseManager.getCollection(getBaseUri() + "/db", uid, pwd); + try (final Collection col = DatabaseManager.getCollection(getBaseUri() + "/db", uid, pwd)) { final UserManagementService ums = col.getService(UserManagementService.class); final Group group = ums.getGroup(group_uid); @@ -333,78 +299,40 @@ protected void createAccount(String account_uid, String account_pwd, String grou } catch(final XMLDBException xmldbe) { throw new ApiException(xmldbe); - } finally { - if(col != null) { - try { - col.close(); - } catch (final XMLDBException xmldbe) { - throw new ApiException(xmldbe); - } - } } } @Override protected void createGroup(String group_uid, String uid, String pwd) throws ApiException { - Collection col = null; - try { - col = DatabaseManager.getCollection(getBaseUri() + "/db", uid, pwd); + try (final Collection col = DatabaseManager.getCollection(getBaseUri() + "/db", uid, pwd)) { final UserManagementService ums = col.getService(UserManagementService.class); Group group = new GroupAider("exist", group_uid); ums.addGroup(group); } catch(final XMLDBException xmldbe) { throw new ApiException(xmldbe); - } finally { - if(col != null) { - try { - col.close(); - } catch (final XMLDBException xmldbe) { - throw new ApiException(xmldbe); - } - } } } @Override protected void createXmlResource(String resourceUri, String content, String uid, String pwd) throws ApiException { - Collection col = null; - try { - col = DatabaseManager.getCollection(getBaseUri() + getCollectionUri(resourceUri), uid, pwd); - Resource resource = col.createResource(getResourceName(resourceUri), XMLResource.class); + try (final Collection col = DatabaseManager.getCollection(getBaseUri() + getCollectionUri(resourceUri), uid, pwd); + final Resource resource = col.createResource(getResourceName(resourceUri), XMLResource.class)) { resource.setContent(content); col.storeResource(resource); } catch(final XMLDBException xmldbe) { throw new ApiException(xmldbe); - } finally { - if(col != null) { - try { - col.close(); - } catch (final XMLDBException xmldbe) { - throw new ApiException(xmldbe); - } - } } } @Override protected void createBinResource(String resourceUri, byte[] content, String uid, String pwd) throws ApiException { - Collection col = null; - try { - col = DatabaseManager.getCollection(getBaseUri() + getCollectionUri(resourceUri), uid, pwd); - Resource resource = col.createResource(getResourceName(resourceUri), BinaryResource.class); + try (final Collection col = DatabaseManager.getCollection(getBaseUri() + getCollectionUri(resourceUri), uid, pwd); + final Resource resource = col.createResource(getResourceName(resourceUri), BinaryResource.class)) { resource.setContent(content); col.storeResource(resource); } catch(final XMLDBException xmldbe) { throw new ApiException(xmldbe); - } finally { - if(col != null) { - try { - col.close(); - } catch (final XMLDBException xmldbe) { - throw new ApiException(xmldbe); - } - } } } } diff --git a/exist-core/src/test/java/org/exist/security/internal/BackupRestoreSecurityPrincipalsTest.java b/exist-core/src/test/java/org/exist/security/internal/BackupRestoreSecurityPrincipalsTest.java index 33d7ac00fb..3473abc8de 100644 --- a/exist-core/src/test/java/org/exist/security/internal/BackupRestoreSecurityPrincipalsTest.java +++ b/exist-core/src/test/java/org/exist/security/internal/BackupRestoreSecurityPrincipalsTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -30,6 +54,7 @@ import org.exist.security.internal.aider.UserAider; import org.exist.storage.BrokerPool; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.EXistRestoreService; import org.exist.xmldb.NullRestoreServiceTaskListener; import org.exist.xmldb.UserManagementService; @@ -39,7 +64,6 @@ import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -115,60 +139,70 @@ public void restoreConflictingUsername() throws PermissionDeniedException, EXist final SecurityManagerImpl sm = (SecurityManagerImpl) BrokerPool.getInstance().getSecurityManager(); //check the current user accounts - ResourceSet result = xqs.query(accountQuery); - assertUser(RealmImpl.ADMIN_ACCOUNT_ID, SecurityManager.DBA_USER, ((XMLResource) result.getResource(0)).getContentAsDOM()); - assertUser(RealmImpl.GUEST_ACCOUNT_ID, SecurityManager.GUEST_USER, ((XMLResource) result.getResource(1)).getContentAsDOM()); - assertUser(SecurityManagerImpl.INITIAL_LAST_ACCOUNT_ID + 1, "frank", ((XMLResource) result.getResource(2)).getContentAsDOM()); - assertUser(SecurityManagerImpl.INITIAL_LAST_ACCOUNT_ID + 2, "jack", ((XMLResource) result.getResource(3)).getContentAsDOM()); + try (final EXistResourceSet result = (EXistResourceSet) xqs.query(accountQuery)) { + assertUser(RealmImpl.ADMIN_ACCOUNT_ID, SecurityManager.DBA_USER, ((XMLResource) result.getResource(0)).getContentAsDOM()); + assertUser(RealmImpl.GUEST_ACCOUNT_ID, SecurityManager.GUEST_USER, ((XMLResource) result.getResource(1)).getContentAsDOM()); + assertUser(SecurityManagerImpl.INITIAL_LAST_ACCOUNT_ID + 1, "frank", ((XMLResource) result.getResource(2)).getContentAsDOM()); + assertUser(SecurityManagerImpl.INITIAL_LAST_ACCOUNT_ID + 2, "jack", ((XMLResource) result.getResource(3)).getContentAsDOM()); + } //check the last user id assertEquals(SecurityManagerImpl.INITIAL_LAST_ACCOUNT_ID + 2, sm.getLastAccountId()); //last account id should be that of 'jack' - //create a test collection and give everyone access - final CollectionManagementService cms = server.getRoot().getService(CollectionManagementService.class); - final Collection test = cms.createCollection("test"); - final UserManagementService testUms = test.getService(UserManagementService.class); - testUms.chmod("rwxrwxrwx"); - - //create and store a new document as 'frank' - final Collection frankTest = DatabaseManager.getCollection("xmldb:exist:///db/test", FRANK_USER, FRANK_USER); final String FRANKS_DOCUMENT = "franks-document.xml"; - final Resource frankDoc = frankTest.createResource(FRANKS_DOCUMENT, XMLResource.class); - frankDoc.setContent("frank"); - frankTest.storeResource(frankDoc); - - //create and store a new document as 'jack' - final Collection jackTest = DatabaseManager.getCollection("xmldb:exist:///db/test", JACK_USER, JACK_USER); final String JACKS_DOCUMENT = "jacks-document.xml"; - final Resource jackDoc = jackTest.createResource(JACKS_DOCUMENT, XMLResource.class); - jackDoc.setContent("jack"); - jackTest.storeResource(jackDoc); - - //restore the database backup - final EXistRestoreService service = server.getRoot().getService(EXistRestoreService.class); - service.restore(backupFile.normalize().toAbsolutePath().toString(), null, new NullRestoreServiceTaskListener(), false); - - - //check the current user accounts after the restore - result = xqs.query(accountQuery); - assertUser(RealmImpl.ADMIN_ACCOUNT_ID, SecurityManager.DBA_USER, ((XMLResource) result.getResource(0)).getContentAsDOM()); - assertUser(RealmImpl.GUEST_ACCOUNT_ID, SecurityManager.GUEST_USER, ((XMLResource) result.getResource(1)).getContentAsDOM()); - assertUser(SecurityManagerImpl.INITIAL_LAST_ACCOUNT_ID + 1, FRANK_USER, ((XMLResource) result.getResource(2)).getContentAsDOM()); - assertUser(SecurityManagerImpl.INITIAL_LAST_ACCOUNT_ID + 2, JACK_USER, ((XMLResource) result.getResource(3)).getContentAsDOM()); - assertUser(SecurityManagerImpl.INITIAL_LAST_ACCOUNT_ID + 3, JOE_USER, ((XMLResource) result.getResource(4)).getContentAsDOM()); - - //check the last user id after the restore - assertEquals(SecurityManagerImpl.INITIAL_LAST_ACCOUNT_ID + 3, sm.getLastAccountId()); //last account id should be that of 'joe' - - //check the owner of frank's document after restore - final Resource fDoc = test.getResource(FRANKS_DOCUMENT); - final Permission franksDocPermissions = testUms.getPermissions(fDoc); - assertEquals(FRANK_USER, franksDocPermissions.getOwner().getName()); - - //check the owner of jack's document after restore - final Resource jDoc = test.getResource(JACKS_DOCUMENT); - final Permission jacksDocPermissions = testUms.getPermissions(jDoc); - assertEquals(JACK_USER, jacksDocPermissions.getOwner().getName()); + + + //create a test collection and give everyone access + final CollectionManagementService cms = server.getRoot().getService(CollectionManagementService.class); + try (final Collection test = cms.createCollection("test")) { + final UserManagementService testUms = test.getService(UserManagementService.class); + testUms.chmod("rwxrwxrwx"); + + //create and store a new document as 'frank' + try (final Collection frankTest = DatabaseManager.getCollection("xmldb:exist:///db/test", FRANK_USER, FRANK_USER)) { + try (final Resource frankDoc = frankTest.createResource(FRANKS_DOCUMENT, XMLResource.class)) { + frankDoc.setContent("frank"); + frankTest.storeResource(frankDoc); + } + } + + //create and store a new document as 'jack' + try (final Collection jackTest = DatabaseManager.getCollection("xmldb:exist:///db/test", JACK_USER, JACK_USER)) { + try (final Resource jackDoc = jackTest.createResource(JACKS_DOCUMENT, XMLResource.class)) { + jackDoc.setContent("jack"); + jackTest.storeResource(jackDoc); + } + } + + //restore the database backup + final EXistRestoreService service = server.getRoot().getService(EXistRestoreService.class); + service.restore(backupFile.normalize().toAbsolutePath().toString(), null, new NullRestoreServiceTaskListener(), false); + + //check the current user accounts after the restore + try (final EXistResourceSet result = (EXistResourceSet) xqs.query(accountQuery)) { + assertUser(RealmImpl.ADMIN_ACCOUNT_ID, SecurityManager.DBA_USER, ((XMLResource) result.getResource(0)).getContentAsDOM()); + assertUser(RealmImpl.GUEST_ACCOUNT_ID, SecurityManager.GUEST_USER, ((XMLResource) result.getResource(1)).getContentAsDOM()); + assertUser(SecurityManagerImpl.INITIAL_LAST_ACCOUNT_ID + 1, FRANK_USER, ((XMLResource) result.getResource(2)).getContentAsDOM()); + assertUser(SecurityManagerImpl.INITIAL_LAST_ACCOUNT_ID + 2, JACK_USER, ((XMLResource) result.getResource(3)).getContentAsDOM()); + assertUser(SecurityManagerImpl.INITIAL_LAST_ACCOUNT_ID + 3, JOE_USER, ((XMLResource) result.getResource(4)).getContentAsDOM()); + } + + //check the last user id after the restore + assertEquals(SecurityManagerImpl.INITIAL_LAST_ACCOUNT_ID + 3, sm.getLastAccountId()); //last account id should be that of 'joe' + + //check the owner of frank's document after restore + try (final Resource fDoc = test.getResource(FRANKS_DOCUMENT)) { + final Permission franksDocPermissions = testUms.getPermissions(fDoc); + assertEquals(FRANK_USER, franksDocPermissions.getOwner().getName()); + } + + //check the owner of jack's document after restore + try (final Resource jDoc = test.getResource(JACKS_DOCUMENT)) { + final Permission jacksDocPermissions = testUms.getPermissions(jDoc); + assertEquals(JACK_USER, jacksDocPermissions.getOwner().getName()); + } + } } /** diff --git a/exist-core/src/test/java/org/exist/storage/CopyCollectionRecoveryTest.java b/exist-core/src/test/java/org/exist/storage/CopyCollectionRecoveryTest.java index e985025466..17a6cf46ac 100644 --- a/exist-core/src/test/java/org/exist/storage/CopyCollectionRecoveryTest.java +++ b/exist-core/src/test/java/org/exist/storage/CopyCollectionRecoveryTest.java @@ -135,13 +135,16 @@ public void copyToSubCollection() throws Exception { try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = transact.beginTransaction()) { - final Collection src = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI); - broker.saveCollection(transaction, src); + try (final Collection src = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI)) { + broker.saveCollection(transaction, src); - final Collection dst = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI2); - broker.saveCollection(transaction, dst); - broker.copyCollection(transaction, src, dst, src.getURI().lastSegment()); + try (final Collection dst = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI2)) { + broker.saveCollection(transaction, dst); + + broker.copyCollection(transaction, src, dst, src.getURI().lastSegment()); + } + } fail("expect PermissionDeniedException: Cannot copy collection '/db/test' to it child collection '/db/test/test2'"); @@ -155,20 +158,23 @@ private void store() throws EXistException, PermissionDeniedException, IOExcepti try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = transact.beginTransaction()) { - final Collection root = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI); - broker.saveCollection(transaction, root); + try (final Collection root = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI)) { + broker.saveCollection(transaction, root); + } - final Collection test = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI.append("test2")); - broker.saveCollection(transaction, test); + try (final Collection test = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI.append("test2"))) { + broker.saveCollection(transaction, test); - final String sample = getSampleData(); - final MediaType xmlMediaType = pool.getMediaTypeService().getMediaTypeResolver().fromString(MediaType.APPLICATION_XML); - broker.storeDocument(transaction, XmldbURI.create("test.xml"), new StringInputSource(sample), xmlMediaType, test); + final String sample = getSampleData(); + final MediaType xmlMediaType = pool.getMediaTypeService().getMediaTypeResolver().fromString(MediaType.APPLICATION_XML); + broker.storeDocument(transaction, XmldbURI.create("test.xml"), new StringInputSource(sample), xmlMediaType, test); - final Collection dest = broker.getOrCreateCollection(transaction, XmldbURI.ROOT_COLLECTION_URI.append("destination")); - broker.saveCollection(transaction, dest); + try (final Collection dest = broker.getOrCreateCollection(transaction, XmldbURI.ROOT_COLLECTION_URI.append("destination"))) { + broker.saveCollection(transaction, dest); - broker.copyCollection(transaction, test, dest, XmldbURI.create("test3")); + broker.copyCollection(transaction, test, dest, XmldbURI.create("test3")); + } + } transact.commit(transaction); } @@ -237,49 +243,49 @@ private void readAborted() throws EXistException, PermissionDeniedException { } private void xmldbStore() throws XMLDBException, IOException { - final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", ""); - assertNotNull(root); - EXistCollectionManagementService mgr = root.getService(EXistCollectionManagementService.class); - assertNotNull(mgr); - - org.xmldb.api.base.Collection test = root.getChildCollection("test"); - if (test == null) { - test = mgr.createCollection(TestConstants.TEST_COLLECTION_URI.toString()); - } - assertNotNull(test); - - org.xmldb.api.base.Collection test2 = test.getChildCollection("test2"); - if (test2 == null) { - test2 = mgr.createCollection(TestConstants.TEST_COLLECTION_URI.append("test2").toString()); + try (final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", "")) { + assertNotNull(root); + EXistCollectionManagementService mgr = root.getService(EXistCollectionManagementService.class); + assertNotNull(mgr); + + try (final org.xmldb.api.base.Collection test = mgr.createCollection(TestConstants.TEST_COLLECTION_URI.toString())) { + assertNotNull(test); + + try (final org.xmldb.api.base.Collection test2 = mgr.createCollection(TestConstants.TEST_COLLECTION_URI.append("test2").toString())) { + assertNotNull(test2); + + final String sample = getSampleData(); + try (final Resource res = test2.createResource("test_xmldb.xml", XMLResource.class)) { + assertNotNull(res); + res.setContent(sample); + test2.storeResource(res); + } + + try (final org.xmldb.api.base.Collection dest = mgr.createCollection("destination")) { + assertNotNull(dest); + mgr.copy(TestConstants.TEST_COLLECTION_URI2, XmldbURI.ROOT_COLLECTION_URI.append("destination"), XmldbURI.create("test3")); + } + } + } } - assertNotNull(test2); + } - final String sample = getSampleData(); - final Resource res = test2.createResource("test_xmldb.xml", XMLResource.class); - assertNotNull(res); - res.setContent(sample); - test2.storeResource(res); + private void xmldbRead() throws XMLDBException { + try (final org.xmldb.api.base.Collection test = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/destination/test3", "admin", "")) { + assertNotNull(test); - org.xmldb.api.base.Collection dest = root.getChildCollection("destination"); - if (dest == null) { - dest = mgr.createCollection("destination"); - } - assertNotNull(dest); + try (final Resource res = test.getResource("test_xmldb.xml")) { + assertNotNull("Document should not be null", res); + } - mgr.copy(TestConstants.TEST_COLLECTION_URI2, XmldbURI.ROOT_COLLECTION_URI.append("destination"), XmldbURI.create("test3")); - } + try (final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", "")) { + assertNotNull(root); - private void xmldbRead() throws XMLDBException { - final org.xmldb.api.base.Collection test = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/destination/test3", "admin", ""); - assertNotNull(test); - final Resource res = test.getResource("test_xmldb.xml"); - assertNotNull("Document should not be null", res); - - final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", ""); - assertNotNull(root); - final EXistCollectionManagementService mgr = root.getService(EXistCollectionManagementService.class); - assertNotNull(mgr); - mgr.removeCollection("destination"); + final EXistCollectionManagementService mgr = root.getService(EXistCollectionManagementService.class); + assertNotNull(mgr); + mgr.removeCollection("destination"); + } + } } private String getSampleData() throws IOException { diff --git a/exist-core/src/test/java/org/exist/storage/MoveCollectionRecoveryTest.java b/exist-core/src/test/java/org/exist/storage/MoveCollectionRecoveryTest.java index 69ff03fd4d..54a136021c 100644 --- a/exist-core/src/test/java/org/exist/storage/MoveCollectionRecoveryTest.java +++ b/exist-core/src/test/java/org/exist/storage/MoveCollectionRecoveryTest.java @@ -135,15 +135,17 @@ public void moveToSelfSubCollection() throws EXistException, IOException, Permis try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = transact.beginTransaction()) { - final Collection src = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI); - assertNotNull(src); - broker.saveCollection(transaction, src); + try (final Collection src = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI)) { + assertNotNull(src); + broker.saveCollection(transaction, src); - final Collection dst = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI2); - assertNotNull(dst); - broker.saveCollection(transaction, dst); + try (final Collection dst = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI2)) { + assertNotNull(dst); + broker.saveCollection(transaction, dst); - broker.moveCollection(transaction, src, dst, src.getURI().lastSegment()); + broker.moveCollection(transaction, src, dst, src.getURI().lastSegment()); + } + } fail("expect PermissionDeniedException: Cannot move collection '/db/test' to it child collection '/db/test/test2'"); @@ -157,27 +159,31 @@ private void store() throws EXistException, PermissionDeniedException, IOExcepti try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = transact.beginTransaction()) { - final Collection root = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI); - assertNotNull(root); - broker.saveCollection(transaction, root); + try (final Collection root = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI)) { + assertNotNull(root); + broker.saveCollection(transaction, root); + } - final Collection test = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI2); - assertNotNull(test); - broker.saveCollection(transaction, test); + try (final Collection test = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI2)) { + assertNotNull(test); + broker.saveCollection(transaction, test); - final String sample; - try (final InputStream is = SAMPLES.getBiblioSample()) { - assertNotNull(is); - sample = InputStreamUtil.readString(is, UTF_8); - } - final MediaType xmlMediaType = pool.getMediaTypeService().getMediaTypeResolver().fromString(MediaType.APPLICATION_XML); - broker.storeDocument(transaction, TestConstants.TEST_XML_URI, new StringInputSource(sample), xmlMediaType, test); + final String sample; + try (final InputStream is = SAMPLES.getBiblioSample()) { + assertNotNull(is); + sample = InputStreamUtil.readString(is, UTF_8); + } - final Collection dest = broker.getOrCreateCollection(transaction, TestConstants.DESTINATION_COLLECTION_URI); - assertNotNull(dest); - broker.saveCollection(transaction, dest); - broker.moveCollection(transaction, test, dest, XmldbURI.create("test3")); + final MediaType xmlMediaType = pool.getMediaTypeService().getMediaTypeResolver().fromString(MediaType.APPLICATION_XML); + broker.storeDocument(transaction, TestConstants.TEST_XML_URI, new StringInputSource(sample), xmlMediaType, test); + + try (final Collection dest = broker.getOrCreateCollection(transaction, TestConstants.DESTINATION_COLLECTION_URI)) { + assertNotNull(dest); + broker.saveCollection(transaction, dest); + broker.moveCollection(transaction, test, dest, XmldbURI.create("test3")); + } + } transact.commit(transaction); } @@ -190,7 +196,7 @@ private void read() throws EXistException, PermissionDeniedException, SAXExcepti try(final LockedDocument lockedDoc = broker.getXMLResource(TestConstants.DESTINATION_COLLECTION_URI.append("test3").append(TestConstants.TEST_XML_URI), LockMode.READ_LOCK)) { assertNotNull("Document should not be null", lockedDoc); - String data = serializer.serialize(lockedDoc.getDocument()); + final String data = serializer.serialize(lockedDoc.getDocument()); assertNotNull(data); } finally { broker.returnSerializer(serializer); @@ -252,48 +258,45 @@ private void readAborted() throws EXistException, PermissionDeniedException { } private void xmldbStore() throws XMLDBException, IOException { - final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", ""); - assertNotNull(root); - final EXistCollectionManagementService rootMgr = root.getService(EXistCollectionManagementService.class); - assertNotNull(rootMgr); - - org.xmldb.api.base.Collection test = root.getChildCollection("test"); - if (test == null) { - test = rootMgr.createCollection("test"); - } - assertNotNull(test); - - org.xmldb.api.base.Collection test2 = test.getChildCollection("test2"); - if (test2 == null) { - EXistCollectionManagementService testMgr = test.getService(EXistCollectionManagementService.class); - test2 = testMgr.createCollection("test2"); - } - assertNotNull(test2); - - final String sample; - try (final InputStream is = SAMPLES.getBiblioSample()) { - assertNotNull(is); - sample = InputStreamUtil.readString(is, UTF_8); - } - final Resource res = test2.createResource("test_xmldb.xml", XMLResource.class); - assertNotNull(res); - res.setContent(sample); - test2.storeResource(res); - - org.xmldb.api.base.Collection dest = root.getChildCollection(TestConstants.DESTINATION_COLLECTION_URI3.lastSegment().toString()); - if (dest == null) { - dest = rootMgr.createCollection(TestConstants.DESTINATION_COLLECTION_URI3.lastSegment().toString()); + try (final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", "")) { + assertNotNull(root); + final EXistCollectionManagementService rootMgr = root.getService(EXistCollectionManagementService.class); + assertNotNull(rootMgr); + + try (final org.xmldb.api.base.Collection test = rootMgr.createCollection("test")) { + + final EXistCollectionManagementService testMgr = test.getService(EXistCollectionManagementService.class); + try (final org.xmldb.api.base.Collection test2 = testMgr.createCollection("test2")) { + assertNotNull(test2); + + final String sample; + try (final InputStream is = SAMPLES.getBiblioSample()) { + assertNotNull(is); + sample = InputStreamUtil.readString(is, UTF_8); + } + + try (final Resource res = test2.createResource("test_xmldb.xml", XMLResource.class)) { + assertNotNull(res); + res.setContent(sample); + test2.storeResource(res); + } + + try (final org.xmldb.api.base.Collection dest = rootMgr.createCollection(TestConstants.DESTINATION_COLLECTION_URI3.lastSegment().toString())) { + assertNotNull(dest); + rootMgr.move(TestConstants.TEST_COLLECTION_URI2, TestConstants.DESTINATION_COLLECTION_URI3, XmldbURI.create("test3")); + } + } + } } - assertNotNull(dest); - - rootMgr.move(TestConstants.TEST_COLLECTION_URI2, TestConstants.DESTINATION_COLLECTION_URI3, XmldbURI.create("test3")); } private void xmldbRead() throws XMLDBException { - final org.xmldb.api.base.Collection test = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TestConstants.DESTINATION_COLLECTION_URI3.lastSegment().toString() + "/test3", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - assertNotNull(test); - final Resource res = test.getResource("test_xmldb.xml"); - assertNotNull("Document should not be null", res); + try (final org.xmldb.api.base.Collection test = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TestConstants.DESTINATION_COLLECTION_URI3.lastSegment().toString() + "/test3", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + assertNotNull(test); + try (final Resource res = test.getResource("test_xmldb.xml")) { + assertNotNull("Document should not be null", res); + } + } } @After diff --git a/exist-core/src/test/java/org/exist/storage/MoveResourceRecoveryTest.java b/exist-core/src/test/java/org/exist/storage/MoveResourceRecoveryTest.java index a5e6796bb4..13b5117ba3 100644 --- a/exist-core/src/test/java/org/exist/storage/MoveResourceRecoveryTest.java +++ b/exist-core/src/test/java/org/exist/storage/MoveResourceRecoveryTest.java @@ -126,32 +126,35 @@ public void storeAndReadXmldb() throws XMLDBException, DatabaseConfigurationExce xmldbRead(); } - private void store() throws EXistException, PermissionDeniedException, IOException, SAXException, LockException, URISyntaxException { + private void store() throws EXistException, PermissionDeniedException, IOException, SAXException, LockException { final BrokerPool pool = existEmbeddedServer.getBrokerPool(); final TransactionManager transact = pool.getTransactionManager(); try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject())); final Txn transaction = transact.beginTransaction()) { - final Collection test = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI); - assertNotNull(test); - broker.saveCollection(transaction, test); + try (final Collection test = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI)) { + assertNotNull(test); + broker.saveCollection(transaction, test); - final Collection test2 = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI2); - assertNotNull(test2); - broker.saveCollection(transaction, test2); - final String sample; - try (final InputStream is = SAMPLES.getRomeoAndJulietSample()) { - sample = InputStreamUtil.readString(is, UTF_8); - } + try (final Collection test2 = broker.getOrCreateCollection(transaction, TestConstants.TEST_COLLECTION_URI2)) { + assertNotNull(test2); + broker.saveCollection(transaction, test2); - final MediaType xmlMediaType = pool.getMediaTypeService().getMediaTypeResolver().fromString(MediaType.APPLICATION_XML); - broker.storeDocument(transaction, TestConstants.TEST_XML_URI, new StringInputSource(sample), xmlMediaType, test2); + final String sample; + try (final InputStream is = SAMPLES.getRomeoAndJulietSample()) { + sample = InputStreamUtil.readString(is, UTF_8); + } - final DocumentImpl doc = test2.getDocument(broker, TestConstants.TEST_XML_URI); - assertNotNull(doc); - broker.moveResource(transaction, doc, test, XmldbURI.create("new_test.xml")); - broker.saveCollection(transaction, test); + final MediaType xmlMediaType = pool.getMediaTypeService().getMediaTypeResolver().fromString(MediaType.APPLICATION_XML); + broker.storeDocument(transaction, TestConstants.TEST_XML_URI, new StringInputSource(sample), xmlMediaType, test2); + + final DocumentImpl doc = test2.getDocument(broker, TestConstants.TEST_XML_URI); + assertNotNull(doc); + broker.moveResource(transaction, doc, test, XmldbURI.create("new_test.xml")); + broker.saveCollection(transaction, test); + } + } transact.commit(transaction); } @@ -245,42 +248,40 @@ private void readAborted() throws EXistException, PermissionDeniedException, SAX } } - private void xmldbStore() throws XMLDBException, URISyntaxException, IOException { - final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", ""); - final EXistCollectionManagementService mgr = root.getService(EXistCollectionManagementService.class); - - org.xmldb.api.base.Collection test = root.getChildCollection("test"); - if (test == null) { - test = mgr.createCollection("test"); - } + private void xmldbStore() throws XMLDBException, IOException { + try (final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", "")) { + final EXistCollectionManagementService mgr = root.getService(EXistCollectionManagementService.class); - org.xmldb.api.base.Collection test2 = test.getChildCollection("test2"); - if (test2 == null) { - test2 = mgr.createCollection("test2"); - } + try (final org.xmldb.api.base.Collection test = mgr.createCollection("test"); + final org.xmldb.api.base.Collection test2 = mgr.createCollection("test2")) { - final String sample; - try (final InputStream is = SAMPLES.getRomeoAndJulietSample()) { - sample = InputStreamUtil.readString(is, UTF_8); - } + final String sample; + try (final InputStream is = SAMPLES.getRomeoAndJulietSample()) { + sample = InputStreamUtil.readString(is, UTF_8); + } - final Resource res = test2.createResource("test3.xml", XMLResource.class); - res.setContent(sample); - test2.storeResource(res); + try (final Resource res = test2.createResource("test3.xml", XMLResource.class)) { + res.setContent(sample); + test2.storeResource(res); + } - mgr.moveResource(XmldbURI.create(XmldbURI.ROOT_COLLECTION + "/test2/test3.xml"), - TestConstants.TEST_COLLECTION_URI, XmldbURI.create("new_test3.xml")); + mgr.moveResource(XmldbURI.create(XmldbURI.ROOT_COLLECTION + "/test2/test3.xml"), + TestConstants.TEST_COLLECTION_URI, XmldbURI.create("new_test3.xml")); + } + } } private void xmldbRead() throws XMLDBException { - final org.xmldb.api.base.Collection test = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/test", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final Resource res = test.getResource("new_test3.xml"); - assertNotNull("Document should not be null", res); - - final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final EXistCollectionManagementService mgr = root.getService(EXistCollectionManagementService.class); - mgr.removeCollection(XmldbURI.create("test")); - mgr.removeCollection(XmldbURI.create("test2")); + try (final org.xmldb.api.base.Collection test = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/test", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); + final Resource res = test.getResource("new_test3.xml")) { + assertNotNull("Document should not be null", res); + + try (final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final EXistCollectionManagementService mgr = root.getService(EXistCollectionManagementService.class); + mgr.removeCollection(XmldbURI.create("test")); + mgr.removeCollection(XmldbURI.create("test2")); + } + } } @After diff --git a/exist-core/src/test/java/org/exist/storage/UpdateRecoverTest.java b/exist-core/src/test/java/org/exist/storage/UpdateRecoverTest.java index 61427647a1..ea90effa28 100644 --- a/exist-core/src/test/java/org/exist/storage/UpdateRecoverTest.java +++ b/exist-core/src/test/java/org/exist/storage/UpdateRecoverTest.java @@ -106,7 +106,7 @@ public class UpdateRecoverTest { private ExistEmbeddedServer existEmbeddedServer = new ExistEmbeddedServer(true, true); @Test - public void storeAndRead() throws IllegalAccessException, PermissionDeniedException, DatabaseConfigurationException, InstantiationException, SAXException, XMLDBException, EXistException, ClassNotFoundException, LockException, ParserConfigurationException, XPathException, IOException { + public void storeAndRead() throws PermissionDeniedException, DatabaseConfigurationException, SAXException, XMLDBException, EXistException, LockException, ParserConfigurationException, XPathException, IOException { BrokerPool.FORCE_CORRUPTION = true; BrokerPool pool = startDb(); store(pool); @@ -118,15 +118,15 @@ public void storeAndRead() throws IllegalAccessException, PermissionDeniedExcept } @Test - public void storeAndReadXmldb() throws IllegalAccessException, DatabaseConfigurationException, InstantiationException, XMLDBException, EXistException, ClassNotFoundException, IOException { + public void storeAndReadXmldb() throws DatabaseConfigurationException, XMLDBException, EXistException, IOException { BrokerPool.FORCE_CORRUPTION = false; - BrokerPool pool = startDb(); - xmldbStore(pool); + startDb(); + xmldbStore(); BrokerPool.FORCE_CORRUPTION = false; - pool = restartDb(); + restartDb(); - xmldbRead(pool); + xmldbRead(); } private void store(final BrokerPool pool) throws EXistException, PermissionDeniedException, IOException, SAXException, LockException, ParserConfigurationException, XPathException { @@ -309,7 +309,7 @@ private void store(final BrokerPool pool) throws EXistException, PermissionDenie } } - private void read(final BrokerPool pool) throws IllegalAccessException, DatabaseConfigurationException, InstantiationException, ClassNotFoundException, XMLDBException, EXistException, PermissionDeniedException, SAXException { + private void read(final BrokerPool pool) throws EXistException, PermissionDeniedException, SAXException { try(final DBBroker broker = pool.get(Optional.of(pool.getSecurityManager().getSystemSubject()));) { final Serializer serializer = broker.borrowSerializer(); @@ -323,141 +323,145 @@ private void read(final BrokerPool pool) throws IllegalAccessException, Database } } - private void xmldbStore(final BrokerPool pool) throws IllegalAccessException, DatabaseConfigurationException, InstantiationException, ClassNotFoundException, XMLDBException, EXistException { - final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", ""); - assertNotNull(root); - final EXistCollectionManagementService mgr = root.getService(EXistCollectionManagementService.class); - assertNotNull(mgr); - org.xmldb.api.base.Collection test = root.getChildCollection("test"); - if(test == null) { - test = mgr.createCollection(TestConstants.TEST_COLLECTION_URI.toString()); - } - assertNotNull(test); - org.xmldb.api.base.Collection test2 = test.getChildCollection("test2"); - if(test2 == null) { - test2 = mgr.createCollection(TestConstants.TEST_COLLECTION_URI2.toString()); - } - assertNotNull(test2); - final Resource res = test2.createResource("test_xmldb.xml", XMLResource.class); - assertNotNull(res); - res.setContent(TEST_XML); - test2.storeResource(res); - - final XUpdateQueryService service = test2.getService(XUpdateQueryService.class); - assertNotNull(service); - - // insert some nodes - for(int i = 1; i <= 200; i++) { - final String xupdate = - "" + - " " + - " " + - " Product " + i + "" + - " " + (i * 2.5) + "" + - " " + (i * 10) + "" + - " " + - " " + - ""; - service.updateResource("test_xmldb.xml", xupdate); - } + private void xmldbStore() throws XMLDBException { + try (final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", "")) { + assertNotNull(root); + final EXistCollectionManagementService mgr = root.getService(EXistCollectionManagementService.class); + assertNotNull(mgr); - // add attribute - for(int i = 1; i <= 200; i++) { - final String xupdate = - "" + - " " + - " " + i + "" + - " " + - ""; - service.updateResource("test_xmldb.xml", xupdate); - } + try (final org.xmldb.api.base.Collection test = mgr.createCollection(TestConstants.TEST_COLLECTION_URI.toString())) { + assertNotNull(test); - // replace some - for(int i = 1; i <= 100; i++) { - final String xupdate = - "" + - " " + - " " + - " Replaced product" + - " " + (i * 0.75) + "" + - " " + - " " + - ""; - service.updateResource("test_xmldb.xml", xupdate); - } + try (org.xmldb.api.base.Collection test2 = mgr.createCollection(TestConstants.TEST_COLLECTION_URI2.toString())) { + assertNotNull(test2); - // remove some - for(int i = 1; i <= 100; i++) { - final String xupdate = - "" + - " " + - ""; - service.updateResource("test_xmldb.xml", xupdate); - } + try (final Resource res = test2.createResource("test_xmldb.xml", XMLResource.class)) { + assertNotNull(res); + res.setContent(TEST_XML); + test2.storeResource(res); + } - for(int i = 1; i <= 100; i++) { - final String xupdate = - "" + - " " + - " " + - " " + - " Product " + i + "" + - " " + (i * 2.5) + "" + - " " + (i * 10) + "" + - " " + - " " + - ""; - service.updateResource("test_xmldb.xml", xupdate); - } + final XUpdateQueryService service = test2.getService(XUpdateQueryService.class); + assertNotNull(service); - // rename element "description" to "descript" - String xupdate = - "" + - " descript" + - ""; - service.updateResource("test_xmldb.xml", xupdate); - - // update attribute values - for(int i = 1; i <= 200; i++) { - xupdate = - "" + - " " + i + "u" + - ""; - service.updateResource("test_xmldb.xml", xupdate); - } + // insert some nodes + for (int i = 1; i <= 200; i++) { + final String xupdate = + "" + + " " + + " " + + " Product " + i + "" + + " " + (i * 2.5) + "" + + " " + (i * 10) + "" + + " " + + " " + + ""; + service.updateResource("test_xmldb.xml", xupdate); + } - // append new element to records - for(int i = 1; i <= 200; i++) { - xupdate = - "" + - " " + - " " + - " " + - ""; - service.updateResource("test_xmldb.xml", xupdate); - } + // add attribute + for (int i = 1; i <= 200; i++) { + final String xupdate = + "" + + " " + + " " + i + "" + + " " + + ""; + service.updateResource("test_xmldb.xml", xupdate); + } + + // replace some + for (int i = 1; i <= 100; i++) { + final String xupdate = + "" + + " " + + " " + + " Replaced product" + + " " + (i * 0.75) + "" + + " " + + " " + + ""; + service.updateResource("test_xmldb.xml", xupdate); + } + + // remove some + for (int i = 1; i <= 100; i++) { + final String xupdate = + "" + + " " + + ""; + service.updateResource("test_xmldb.xml", xupdate); + } + + for (int i = 1; i <= 100; i++) { + final String xupdate = + "" + + " " + + " " + + " " + + " Product " + i + "" + + " " + (i * 2.5) + "" + + " " + (i * 10) + "" + + " " + + " " + + ""; + service.updateResource("test_xmldb.xml", xupdate); + } + + // rename element "description" to "descript" + String xupdate = + "" + + " descript" + + ""; + service.updateResource("test_xmldb.xml", xupdate); + + // update attribute values + for (int i = 1; i <= 200; i++) { + xupdate = + "" + + " " + i + "u" + + ""; + service.updateResource("test_xmldb.xml", xupdate); + } + + // append new element to records + for (int i = 1; i <= 200; i++) { + xupdate = + "" + + " " + + " " + + " " + + ""; + service.updateResource("test_xmldb.xml", xupdate); + } - // update element content - for(int i = 1; i <= 200; i++) { - xupdate = - "" + - " 19.99" + - ""; - service.updateResource("test_xmldb.xml", xupdate); + // update element content + for (int i = 1; i <= 200; i++) { + xupdate = + "" + + " 19.99" + + ""; + service.updateResource("test_xmldb.xml", xupdate); + } + } + } } } - private void xmldbRead(final BrokerPool pool) throws XMLDBException { - final org.xmldb.api.base.Collection test2 = DatabaseManager.getCollection("xmldb:exist://" + TestConstants.TEST_COLLECTION_URI2, "admin", ""); - assertNotNull(test2); - final Resource res = test2.getResource("test_xmldb.xml"); - assertNotNull("Document should not be null", res); - - final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", ""); - assertNotNull(root); - final EXistCollectionManagementService mgr = root.getService(EXistCollectionManagementService.class); - assertNotNull(mgr); - mgr.removeCollection("test"); + private void xmldbRead() throws XMLDBException { + try (final org.xmldb.api.base.Collection test2 = DatabaseManager.getCollection("xmldb:exist://" + TestConstants.TEST_COLLECTION_URI2, "admin", "")) { + assertNotNull(test2); + try (final Resource res = test2.getResource("test_xmldb.xml")) { + assertNotNull("Document should not be null", res); + } + } + + try (final org.xmldb.api.base.Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", "")) { + assertNotNull(root); + final EXistCollectionManagementService mgr = root.getService(EXistCollectionManagementService.class); + assertNotNull(mgr); + mgr.removeCollection("test"); + } } private BrokerPool startDb() throws EXistException, IOException, DatabaseConfigurationException, XMLDBException { diff --git a/exist-core/src/test/java/org/exist/storage/lock/DeadlockTest.java b/exist-core/src/test/java/org/exist/storage/lock/DeadlockTest.java index 213d012739..f076cf2029 100644 --- a/exist-core/src/test/java/org/exist/storage/lock/DeadlockTest.java +++ b/exist-core/src/test/java/org/exist/storage/lock/DeadlockTest.java @@ -69,6 +69,7 @@ import org.exist.test.TestConstants; import org.exist.util.DatabaseConfigurationException; import org.exist.util.LockException; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.EXistXPathQueryService; import org.exist.xmldb.XmldbURI; import org.junit.*; @@ -80,7 +81,6 @@ import org.xml.sax.SAXException; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Database; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.base.Resource; import org.xmldb.api.modules.CollectionManagementService; @@ -197,9 +197,10 @@ public static void startDB() throws DatabaseConfigurationException, EXistExcepti @After public void clearDB() throws XMLDBException { - final org.xmldb.api.base.Collection root = DatabaseManager.getCollection("xmldb:exist:///db/test", "admin", ""); - CollectionManagementService service = root.getService(CollectionManagementService.class); - service.removeCollection("."); + try (final org.xmldb.api.base.Collection root = DatabaseManager.getCollection("xmldb:exist:///db/test", "admin", "")) { + CollectionManagementService service = root.getService(CollectionManagementService.class); + service.removeCollection("."); + } } @Test @@ -337,16 +338,16 @@ public void run() { } String query = buf.toString(); - try { - org.xmldb.api.base.Collection testCollection = DatabaseManager - .getCollection("xmldb:exist://" + collection, "admin", null); + try (final org.xmldb.api.base.Collection testCollection = DatabaseManager + .getCollection("xmldb:exist://" + collection, "admin", null)) { if (testCollection == null) return; EXistXPathQueryService service = testCollection.getService(EXistXPathQueryService.class); service.beginProtected(); try { - ResourceSet result = service.query(query); - result.getSize(); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + result.getSize(); + } } finally { service.endProtected(); } @@ -374,9 +375,8 @@ public void run() { final String collection = "/db/test/" + collectionId; final int docId = random.nextInt(documentCount) * collectionId; final String document = "test" + docId + ".xml"; - try { - final org.xmldb.api.base.Collection testCollection = DatabaseManager.getCollection("xmldb:exist://" + collection, "admin", ""); - final Resource resource = testCollection.getResource(document); + try (final org.xmldb.api.base.Collection testCollection = DatabaseManager.getCollection("xmldb:exist://" + collection, "admin", ""); + final Resource resource = testCollection.getResource(document)) { if (resource != null) { testCollection.removeResource(resource); removed = true; diff --git a/exist-core/src/test/java/org/exist/storage/lock/ProtectedModeTest.java b/exist-core/src/test/java/org/exist/storage/lock/ProtectedModeTest.java index e7b67963a2..e4bc4ce511 100644 --- a/exist-core/src/test/java/org/exist/storage/lock/ProtectedModeTest.java +++ b/exist-core/src/test/java/org/exist/storage/lock/ProtectedModeTest.java @@ -47,6 +47,7 @@ import org.exist.TestDataGenerator; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.EXistXPathQueryService; import org.junit.AfterClass; import static org.junit.Assert.assertEquals; @@ -56,7 +57,6 @@ import org.xml.sax.SAXException; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -97,43 +97,45 @@ public class ProtectedModeTest { @Test public void queryCollection() throws XMLDBException { - final Collection root = DatabaseManager.getCollection("xmldb:exist:///db/protected", "admin", ""); - final EXistXPathQueryService service = root.getService(EXistXPathQueryService.class); - try { + try (final Collection root = DatabaseManager.getCollection("xmldb:exist:///db/protected", "admin", "")) { + final EXistXPathQueryService service = root.getService(EXistXPathQueryService.class); + service.beginProtected(); - final ResourceSet result = service.query("collection('/db/protected/test5')//book"); - assertEquals(DOCUMENT_COUNT, result.getSize()); - } finally { - service.endProtected(); + try (final EXistResourceSet result = (EXistResourceSet) service.query("collection('/db/protected/test5')//book")) { + assertEquals(DOCUMENT_COUNT, result.getSize()); + } finally { + service.endProtected(); + } } } @Test public void queryRoot() throws XMLDBException { - final Collection root = DatabaseManager.getCollection("xmldb:exist:///db/protected", "admin", ""); - final EXistXPathQueryService service = root.getService(EXistXPathQueryService.class); - try { + try (final Collection root = DatabaseManager.getCollection("xmldb:exist:///db/protected", "admin", "")) { + final EXistXPathQueryService service = root.getService(EXistXPathQueryService.class); + service.beginProtected(); - final ResourceSet result = service.query("//book"); - assertEquals(COLLECTION_COUNT * DOCUMENT_COUNT, result.getSize()); - } finally { - service.endProtected(); + try (final EXistResourceSet result = (EXistResourceSet) service.query("//book")) { + assertEquals(COLLECTION_COUNT * DOCUMENT_COUNT, result.getSize()); + } finally { + service.endProtected(); + } } } @Test public void queryDocs() throws XMLDBException { - final Collection root = DatabaseManager.getCollection("xmldb:exist:///db/protected", "admin", ""); - final EXistXPathQueryService service = root.getService(EXistXPathQueryService.class); - final Random random = new Random(); - for (int i = 0; i < COLLECTION_COUNT; i++) { - String docURI = "doc('/db/protected/test" + i + "/xdb" + random.nextInt(DOCUMENT_COUNT) + ".xml')"; - try { + try (final Collection root = DatabaseManager.getCollection("xmldb:exist:///db/protected", "admin", "")) { + final EXistXPathQueryService service = root.getService(EXistXPathQueryService.class); + final Random random = new Random(); + for (int i = 0; i < COLLECTION_COUNT; i++) { + String docURI = "doc('/db/protected/test" + i + "/xdb" + random.nextInt(DOCUMENT_COUNT) + ".xml')"; service.beginProtected(); - final ResourceSet result = service.query(docURI + "//book"); - assertEquals(1, result.getSize()); - } finally { - service.endProtected(); + try (final EXistResourceSet result = (EXistResourceSet) service.query(docURI + "//book")) { + assertEquals(1, result.getSize()); + } finally { + service.endProtected(); + } } } } @@ -141,22 +143,25 @@ public void queryDocs() throws XMLDBException { @BeforeClass public static void setupDb() throws XMLDBException, SAXException { CollectionManagementService mgmt = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - final Collection collection = mgmt.createCollection("protected"); + try (final Collection collection = mgmt.createCollection("protected")) { - mgmt = collection.getService(CollectionManagementService.class); + mgmt = collection.getService(CollectionManagementService.class); - final TestDataGenerator generator = new TestDataGenerator("xdb", DOCUMENT_COUNT); - for (int i = 0; i < COLLECTION_COUNT; i++) { - Collection currentColl = mgmt.createCollection("test" + i); - try { - final Path[] files = generator.generate(currentColl, generateXQ); - for (int j = 0; j < files.length; j++) { - final XMLResource resource = currentColl.createResource("xdb" + j + ".xml", XMLResource.class); - resource.setContent(files[j].toFile()); - currentColl.storeResource(resource); + final TestDataGenerator generator = new TestDataGenerator("xdb", DOCUMENT_COUNT); + for (int i = 0; i < COLLECTION_COUNT; i++) { + try (final Collection currentColl = mgmt.createCollection("test" + i)) { + try { + final Path[] files = generator.generate(currentColl, generateXQ); + for (int j = 0; j < files.length; j++) { + try (final XMLResource resource = currentColl.createResource("xdb" + j + ".xml", XMLResource.class)) { + resource.setContent(files[j].toFile()); + currentColl.storeResource(resource); + } + } + } finally { + generator.releaseAll(); + } } - } finally { - generator.releaseAll(); } } } diff --git a/exist-core/src/test/java/org/exist/util/io/FilterInputStreamCacheMonitorTest.java b/exist-core/src/test/java/org/exist/util/io/FilterInputStreamCacheMonitorTest.java index 4bad64b422..425058b69c 100644 --- a/exist-core/src/test/java/org/exist/util/io/FilterInputStreamCacheMonitorTest.java +++ b/exist-core/src/test/java/org/exist/util/io/FilterInputStreamCacheMonitorTest.java @@ -49,6 +49,7 @@ import net.jpountz.xxhash.XXHashFactory; import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.xmldb.EXistResource; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.ExtendedResource; import org.exist.xmldb.LocalBinaryResource; import org.exist.xmldb.LocalXMLResource; @@ -65,7 +66,6 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; @@ -101,12 +101,11 @@ public static void setup() throws XMLDBException, URISyntaxException, IOExceptio final byte[] iconBytes = Files.readAllBytes(icon); EXPECTED_ICON_HASH = XXHASH64.hash(iconBytes, 0, iconBytes.length, XXHASH64_SEED); - final Collection testCollection = existXmldbEmbeddedServer.createCollection(existXmldbEmbeddedServer.getRoot(), TEST_COLLECTION_NAME); - try (final EXistResource resource = (EXistResource) testCollection.createResource("icon.png", BinaryResource.class)) { + try (final Collection testCollection = existXmldbEmbeddedServer.createCollection(existXmldbEmbeddedServer.getRoot(), TEST_COLLECTION_NAME); + final EXistResource resource = (EXistResource)testCollection.createResource("icon.png", BinaryResource.class)) { resource.setContent(icon); testCollection.storeResource(resource); } - testCollection.close(); } @AfterClass @@ -123,9 +122,7 @@ public void binaryResult() throws XMLDBException, XPathException { int activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); - ResourceSet resourceSet = null; - try { - resourceSet = existXmldbEmbeddedServer.executeQuery("util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')"); + try (final EXistResourceSet resourceSet = existXmldbEmbeddedServer.executeQuery("util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')")) { assertEquals(1, resourceSet.getSize()); @@ -149,8 +146,6 @@ public void binaryResult() throws XMLDBException, XPathException { activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); - } finally { - resourceSet.clear(); } // final assert no active binaries as we just cleared the resource-set @@ -166,12 +161,10 @@ public void singleElementEnclosedExprBinaryValueStringResult() throws XMLDBExcep int activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); - ResourceSet resourceSet = null; - try { - resourceSet = existXmldbEmbeddedServer.executeQuery( + try (final EXistResourceSet resourceSet = existXmldbEmbeddedServer.executeQuery( "let $embedded := {util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')}\n" + - "return\n" + - "xmldb:store('/db/" + TEST_COLLECTION_NAME + "', 'icon.xml', $embedded)"); + "return\n" + + "xmldb:store('/db/" + TEST_COLLECTION_NAME + "', 'icon.xml', $embedded)")) { assertEquals(1, resourceSet.getSize()); try (final EXistResource resource = (EXistResource) resourceSet.getResource(0)) { @@ -182,11 +175,9 @@ public void singleElementEnclosedExprBinaryValueStringResult() throws XMLDBExcep assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } - } finally { - resourceSet.clear(); } - // final assert no active binaries as we just cleared the resource-set + // final assert no active binaries as we just cleared the resource-set in the try-with-resources activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } @@ -199,14 +190,12 @@ public void multipleElementsEnclosedExprBinaryValueStringResult() throws XMLDBEx int activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); - ResourceSet resourceSet = null; - try { - resourceSet = existXmldbEmbeddedServer.executeQuery( + try (final EXistResourceSet resourceSet = existXmldbEmbeddedServer.executeQuery( "let $bin := util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')\n" + "let $embedded := {$bin}\n" + "let $embedded-2 := {$bin}\n" + "return\n" + - "xmldb:store('/db/" + TEST_COLLECTION_NAME + "', 'icon.xml', $embedded)"); + "xmldb:store('/db/" + TEST_COLLECTION_NAME + "', 'icon.xml', $embedded)")) { assertEquals(1, resourceSet.getSize()); try (final EXistResource resource = (EXistResource) resourceSet.getResource(0)) { @@ -217,11 +206,9 @@ public void multipleElementsEnclosedExprBinaryValueStringResult() throws XMLDBEx assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } - } finally { - resourceSet.clear(); } - // final assert no active binaries as we just cleared the resource-set + // final assert no active binaries as we just cleared the resource-set in the try-with-resources activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } @@ -234,9 +221,7 @@ public void singleElementEnclosedExprBinaryValueElementResult() throws XMLDBExce int activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); - ResourceSet resourceSet = null; - try { - resourceSet = existXmldbEmbeddedServer.executeQuery("{util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')}"); + try (final EXistResourceSet resourceSet = existXmldbEmbeddedServer.executeQuery("{util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')}")) { assertEquals(1, resourceSet.getSize()); try (final EXistResource resource = (EXistResource) resourceSet.getResource(0)) { @@ -258,11 +243,9 @@ public void singleElementEnclosedExprBinaryValueElementResult() throws XMLDBExce assertEquals(EXPECTED_ICON_HASH, retrievedIconHash); } - } finally { - resourceSet.clear(); } - // final assert no active binaries as we just cleared the resource-set + // final assert no active binaries as we just cleared the resource-set in the try-with-resources activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } @@ -275,12 +258,10 @@ public void multipleElementsEnclosedExprBinaryValueElementResults() throws XMLDB int activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); - ResourceSet resourceSet = null; - try { - resourceSet = existXmldbEmbeddedServer.executeQuery( + try (final EXistResourceSet resourceSet = existXmldbEmbeddedServer.executeQuery( "let $bin := util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')\n" + "return\n" + - "({$bin}, {$bin})"); + "({$bin}, {$bin})")) { assertEquals(2, resourceSet.getSize()); @@ -321,11 +302,9 @@ public void multipleElementsEnclosedExprBinaryValueElementResults() throws XMLDB assertEquals(EXPECTED_ICON_HASH, retrievedIconHash); } - } finally { - resourceSet.clear(); } - // final assert no active binaries as we just cleared the resource-set + // final assert no active binaries as we just cleared the resource-set in the try-with-resources activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } @@ -338,10 +317,8 @@ public void mapEnclosedBinaryValueMapResult() throws XMLDBException, XPathExcept int activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); - ResourceSet resourceSet = null; - try { - resourceSet = existXmldbEmbeddedServer.executeQuery( - "map { 'key1': util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png') }"); + try (final EXistResourceSet resourceSet = existXmldbEmbeddedServer.executeQuery( + "map { 'key1': util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png') }")) { assertEquals(1, resourceSet.getSize()); try (final EXistResource resource = (EXistResource) resourceSet.getResource(0)) { @@ -367,11 +344,9 @@ public void mapEnclosedBinaryValueMapResult() throws XMLDBException, XPathExcept activeCount = monitor.getActive().size(); assertEquals(1, activeCount); - } finally { - resourceSet.clear(); } - // final assert no active binaries as we just cleared the resource-set + // final assert no active binaries as we just cleared the resource-set in the try-with-resources activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } @@ -384,10 +359,8 @@ public void mapEnclosedBinaryValuesMapResult() throws XMLDBException, XPathExcep int activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); - ResourceSet resourceSet = null; - try { - resourceSet = existXmldbEmbeddedServer.executeQuery( - "map { 'key1': util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png'), 'key2': util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png') }"); + try (final EXistResourceSet resourceSet = existXmldbEmbeddedServer.executeQuery( + "map { 'key1': util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png'), 'key2': util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png') }")) { assertEquals(1, resourceSet.getSize()); try (final EXistResource resource = (EXistResource)resourceSet.getResource(0)) { @@ -413,11 +386,9 @@ public void mapEnclosedBinaryValuesMapResult() throws XMLDBException, XPathExcep activeCount = monitor.getActive().size(); assertEquals(2, activeCount); - } finally { - resourceSet.clear(); } - // final assert no active binaries as we just cleared the resource-set + // final assert no active binaries as we just cleared the resource-set in the try-with-resources activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } @@ -430,12 +401,10 @@ public void mapEnclosedMapBinaryValueMapResult() throws XMLDBException, XPathExc int activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); - ResourceSet resourceSet = null; - try { - resourceSet = existXmldbEmbeddedServer.executeQuery( + try (final EXistResourceSet resourceSet = existXmldbEmbeddedServer.executeQuery( "let $bin := util:binary-doc('/db/" + TEST_COLLECTION_NAME + "/icon.png')\n" + "return\n" + - "map { 'key1': $bin, 'key2': map { 'key3': $bin } }"); + "map { 'key1': $bin, 'key2': map { 'key3': $bin } }")) { assertEquals(1, resourceSet.getSize()); try (final EXistResource resource = (EXistResource)resourceSet.getResource(0)) { @@ -472,11 +441,9 @@ public void mapEnclosedMapBinaryValueMapResult() throws XMLDBException, XPathExc activeCount = monitor.getActive().size(); assertEquals(1, activeCount); - } finally { - resourceSet.clear(); } - // final assert no active binaries as we just cleared the resource-set + // final assert no active binaries as we just cleared the resource-set in the try-with-resources activeCount = monitor.getActive().size(); assertEquals("FilterInputStreamCacheMonitor should again have no active binaries, but found: " + activeCount + "." + EOL + monitor.dump(), 0, activeCount); } diff --git a/exist-core/src/test/java/org/exist/validation/CollectionConfigurationTest.java b/exist-core/src/test/java/org/exist/validation/CollectionConfigurationTest.java index 6747662d23..a83267fb97 100644 --- a/exist-core/src/test/java/org/exist/validation/CollectionConfigurationTest.java +++ b/exist-core/src/test/java/org/exist/validation/CollectionConfigurationTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,12 +46,13 @@ package org.exist.validation; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.xmldb.api.base.Collection; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.junit.Test; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.modules.CollectionManagementService; import static org.exist.collections.CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE; @@ -47,17 +72,22 @@ public class CollectionConfigurationTest { private void createCollection(String collection) throws XMLDBException { final CollectionManagementService cmservice = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - Collection testCollection = cmservice.createCollection(collection); - assertNotNull(testCollection); + try (final Collection testCollection = cmservice.createCollection(collection)) { + assertNotNull(testCollection); + } - testCollection = cmservice.createCollection("/db/system/config" + collection); - assertNotNull(testCollection); + try (final Collection testCollection = cmservice.createCollection("/db/system/config" + collection)) { + assertNotNull(testCollection); + } } - private void storeCollectionXconf(String collection, String document) throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("xmldb:store(\"" + collection + "\", \"" + DEFAULT_COLLECTION_CONFIG_FILE + "\", " + document + ")"); - String r = (String) result.getResource(0).getContent(); - assertEquals("Store xconf", collection + "/" + DEFAULT_COLLECTION_CONFIG_FILE, r); + private void storeCollectionXconf(final String collection, final String document) throws XMLDBException { + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("xmldb:store(\"" + collection + "\", \"" + DEFAULT_COLLECTION_CONFIG_FILE + "\", " + document + ")")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("Store xconf", collection + "/" + DEFAULT_COLLECTION_CONFIG_FILE, r); + } + } } diff --git a/exist-core/src/test/java/org/exist/validation/CollectionConfigurationValidationModeTest.java b/exist-core/src/test/java/org/exist/validation/CollectionConfigurationValidationModeTest.java index e185dc8205..5367568efe 100644 --- a/exist-core/src/test/java/org/exist/validation/CollectionConfigurationValidationModeTest.java +++ b/exist-core/src/test/java/org/exist/validation/CollectionConfigurationValidationModeTest.java @@ -48,11 +48,12 @@ import com.evolvedbinary.j8fu.function.RunnableE; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; import org.xmldb.api.base.Collection; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.modules.CollectionManagementService; import static org.exist.collections.CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE; @@ -80,33 +81,45 @@ public class CollectionConfigurationValidationModeTest { @AfterClass public static void tearDownClass() throws Exception { - existEmbeddedServer.executeQuery("validation:clear-grammar-cache()"); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("validation:clear-grammar-cache()")) { + // needed to close the resource set + } } @Before public void setUp() throws Exception { - existEmbeddedServer.executeQuery("validation:clear-grammar-cache()"); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("validation:clear-grammar-cache()")) { + // needed to close the resource set + } } private void createCollection(final String collection) throws XMLDBException { final CollectionManagementService cmservice = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - Collection testCollection = cmservice.createCollection(collection); - assertNotNull(testCollection); + try (final Collection testCollection = cmservice.createCollection(collection)) { + assertNotNull(testCollection); + } - testCollection = cmservice.createCollection("/db/system/config" + collection); - assertNotNull(testCollection); + try (final Collection testCollection = cmservice.createCollection("/db/system/config" + collection)) { + assertNotNull(testCollection); + } } private void storeCollectionXconf(final String collection, final String document) throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("xmldb:store(\"" + collection + "\", \"" + DEFAULT_COLLECTION_CONFIG_FILE + "\", " + document + ")"); - final String r = (String) result.getResource(0).getContent(); - assertEquals("Store xconf", collection + "/" + DEFAULT_COLLECTION_CONFIG_FILE, r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("xmldb:store(\"" + collection + "\", \"" + DEFAULT_COLLECTION_CONFIG_FILE + "\", " + document + ")")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("Store xconf", collection + "/" + DEFAULT_COLLECTION_CONFIG_FILE, r); + } + } } private void storeDocument(final String collection, final String name, final String document) throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("xmldb:store(\"" + collection + "\", \"" + name + "\", " + document + ")"); - final String r = (String) result.getResource(0).getContent(); - assertEquals("Store doc", collection + "/" + name, r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("xmldb:store(\"" + collection + "\", \"" + name + "\", " + document + ")")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("Store doc", collection + "/" + name, r); + } + } } @Test diff --git a/exist-core/src/test/java/org/exist/validation/DatabaseCollectionTest.java b/exist-core/src/test/java/org/exist/validation/DatabaseCollectionTest.java index c860f637d6..37ed10cae5 100644 --- a/exist-core/src/test/java/org/exist/validation/DatabaseCollectionTest.java +++ b/exist-core/src/test/java/org/exist/validation/DatabaseCollectionTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -56,13 +80,14 @@ public class DatabaseCollectionTest { @Before public void setUp() throws XMLDBException { final CollectionManagementService cms = existServer.getRoot().getService(CollectionManagementService.class); - final Collection test = cms.createCollection(TEST_COLLECTION); - final UserManagementService ums = test.getService(UserManagementService.class); + try (final Collection test = cms.createCollection(TEST_COLLECTION)) { + final UserManagementService ums = test.getService(UserManagementService.class); - // change ownership to guest - final Account guest = ums.getAccount(TestUtils.GUEST_DB_USER); - ums.chown(guest, guest.getPrimaryGroup()); - ums.chmod(Permission.DEFAULT_COLLECTION_PERM); + // change ownership to guest + final Account guest = ums.getAccount(TestUtils.GUEST_DB_USER); + ums.chown(guest, guest.getPrimaryGroup()); + ums.chmod(Permission.DEFAULT_COLLECTION_PERM); + } } @After @@ -74,18 +99,23 @@ public void tearDown() throws XMLDBException { @Test public void createCollections() throws XMLDBException { - final Collection testCollection = DatabaseManager.getCollection(ROOT_URI + "/" + TEST_COLLECTION); - final CollectionManagementService service = testCollection.getService(CollectionManagementService.class); - Collection validationCollection = service.createCollection(TestTools.VALIDATION_HOME_COLLECTION); - assertNotNull(validationCollection); + try (final Collection testCollection = DatabaseManager.getCollection(ROOT_URI + "/" + TEST_COLLECTION)) { + final CollectionManagementService service = testCollection.getService(CollectionManagementService.class); + try (final Collection validationCollection = service.createCollection(TestTools.VALIDATION_HOME_COLLECTION)) { + assertNotNull(validationCollection); + } - validationCollection = service.createCollection(TestTools.VALIDATION_HOME_COLLECTION + "/" + TestTools.VALIDATION_TMP_COLLECTION); - assertNotNull(validationCollection); + try (final Collection validationCollection = service.createCollection(TestTools.VALIDATION_HOME_COLLECTION + "/" + TestTools.VALIDATION_TMP_COLLECTION)) { + assertNotNull(validationCollection); + } - validationCollection = service.createCollection(TestTools.VALIDATION_HOME_COLLECTION + "/" + TestTools.VALIDATION_XSD_COLLECTION); - assertNotNull(validationCollection); + try (final Collection validationCollection = service.createCollection(TestTools.VALIDATION_HOME_COLLECTION + "/" + TestTools.VALIDATION_XSD_COLLECTION)) { + assertNotNull(validationCollection); + } - validationCollection = service.createCollection(TestTools.VALIDATION_HOME_COLLECTION + "/" + TestTools.VALIDATION_DTD_COLLECTION); - assertNotNull(validationCollection); + try (final Collection validationCollection = service.createCollection(TestTools.VALIDATION_HOME_COLLECTION + "/" + TestTools.VALIDATION_DTD_COLLECTION)) { + assertNotNull(validationCollection); + } + } } } diff --git a/exist-core/src/test/java/org/exist/validation/DtdEntityTest.java b/exist-core/src/test/java/org/exist/validation/DtdEntityTest.java index 323c441ee4..b2eed56b49 100644 --- a/exist-core/src/test/java/org/exist/validation/DtdEntityTest.java +++ b/exist-core/src/test/java/org/exist/validation/DtdEntityTest.java @@ -67,7 +67,7 @@ public class DtdEntityTest { public void loadWithEntities() throws XMLDBException { final String input = "first empty: ∅ then trade: ™ "; - try (Collection col = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "entity")) { + try (final Collection col = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "entity")) { existEmbeddedServer.storeResource(col, "docname.xml", input.getBytes()); // should throw XMLDBException @@ -87,7 +87,7 @@ public void bugloadWithEntities() throws XMLDBException { + "" + "first empty: ∅ then trade: ™ "; - try (Collection col = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "entity")) { + try (final Collection col = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "entity")) { existEmbeddedServer.storeResource(col, "docname.xml", input.getBytes(UTF_8)); // should throw XMLDBException diff --git a/exist-core/src/test/java/org/exist/xmldb/BinaryResourceUpdateTest.java b/exist-core/src/test/java/org/exist/xmldb/BinaryResourceUpdateTest.java index 75649f6ffc..454d440b50 100644 --- a/exist-core/src/test/java/org/exist/xmldb/BinaryResourceUpdateTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/BinaryResourceUpdateTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -56,19 +80,23 @@ public class BinaryResourceUpdateTest { @Test public void updateBinary() throws XMLDBException, URISyntaxException { for (int i = 0; i < REPEAT; i++) { - BinaryResource binaryResource = testCollection.createResource("test1.xml", BinaryResource.class); - binaryResource.setContent(Paths.get(binFile.toURI())); - testCollection.storeResource(binaryResource); - - Resource resource = testCollection.getResource("test1.xml"); - assertNotNull(resource); - - XMLResource xmlResource = testCollection.createResource("test2.xml", XMLResource.class); - xmlResource.setContent(Paths.get(xmlFile.toURI())); - testCollection.storeResource(xmlResource); - - resource = testCollection.getResource("test2.xml"); - assertNotNull(resource); + try (final BinaryResource binaryResource = testCollection.createResource("test1.xml", BinaryResource.class)) { + binaryResource.setContent(Paths.get(binFile.toURI())); + testCollection.storeResource(binaryResource); + } + + try (final Resource resource = testCollection.getResource("test1.xml")) { + assertNotNull(resource); + } + + try (final XMLResource xmlResource = testCollection.createResource("test2.xml", XMLResource.class)) { + xmlResource.setContent(Paths.get(xmlFile.toURI())); + testCollection.storeResource(xmlResource); + } + + try (final Resource resource = testCollection.getResource("test2.xml")) { + assertNotNull(resource); + } } } @@ -77,20 +105,23 @@ public void updateBinary() throws XMLDBException, URISyntaxException { @Test public void updateBinary_windows() throws XMLDBException, URISyntaxException { for (int i = 0; i < REPEAT; i++) { - BinaryResource binaryResource = testCollection.createResource("test.xml", BinaryResource.class); - binaryResource.setContent(Paths.get(binFile.toURI())); - testCollection.storeResource(binaryResource); - - Resource resource = testCollection.getResource("test.xml"); - assertNotNull(resource); - - XMLResource xmlResource = testCollection.createResource("test.xml", XMLResource.class); - xmlResource.setContent(Paths.get(xmlFile.toURI())); - testCollection.storeResource(xmlResource); - - resource = testCollection.getResource("test.xml"); - assertNotNull(resource); - + try (final BinaryResource binaryResource = testCollection.createResource("test.xml", BinaryResource.class)) { + binaryResource.setContent(Paths.get(binFile.toURI())); + testCollection.storeResource(binaryResource); + } + + try (final Resource resource = testCollection.getResource("test.xml")) { + assertNotNull(resource); + } + + try (final XMLResource xmlResource = testCollection.createResource("test.xml", XMLResource.class)) { + xmlResource.setContent(Paths.get(xmlFile.toURI())); + testCollection.storeResource(xmlResource); + } + + try (final Resource resource = testCollection.getResource("test.xml")) { + assertNotNull(resource); + } } } @@ -108,8 +139,11 @@ public void setUp() throws Exception { @After public void tearDown() throws XMLDBException { //delete the test collection - final CollectionManagementService service = testCollection.getParentCollection().getService(CollectionManagementService.class); - service.removeCollection(TEST_COLLECTION); + try (final Collection parent = testCollection.getParentCollection()) { + final CollectionManagementService service = parent.getService(CollectionManagementService.class); + testCollection.close(); + service.removeCollection(TEST_COLLECTION); + } binFile = null; xmlFile = null; } diff --git a/exist-core/src/test/java/org/exist/xmldb/CollectionConfigurationTest.java b/exist-core/src/test/java/org/exist/xmldb/CollectionConfigurationTest.java index a4d0451e1d..258f28f3b6 100644 --- a/exist-core/src/test/java/org/exist/xmldb/CollectionConfigurationTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/CollectionConfigurationTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -31,13 +55,14 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertThrows; + import org.exist.collections.CollectionConfiguration; import org.exist.test.TestConstants; import org.exist.xquery.Constants; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -78,81 +103,81 @@ public class CollectionConfigurationTest { " xxx" + ""; - private final static String CONFIG1 = "" + private final static String CONFIG1 = "" + " " - + " " - + " " - + " " - + " " + + " " + + " " + + " " + + " " + " " + ""; - private final static String CONFIG2 = "" + private final static String CONFIG2 = "" + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + " " + ""; - private final static String CONFIG3 = "" + private final static String CONFIG3 = "" + " " - + " " - + " " + + " " + + " " + " " + ""; - private final static String QNAME_CONFIG = "" + private final static String QNAME_CONFIG = "" + " " - + " " - + " " - + " " - + " " - + " " - + " " + + " " + + " " + + " " + + " " + + " " + + " " + " " + ""; - private final String QNAME_CONFIG2 = "" + private final String QNAME_CONFIG2 = "" + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " - + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + " " + ""; - private final static String EMPTY_CONFIG = "" + private final static String EMPTY_CONFIG = "" + " " + " " + ""; - private final static String INVALID_CONFIG1 = "\n" + private final static String INVALID_CONFIG1 = "\n" + " \n" - + " \n" + + " \n" + " \n" + " \n" + " \n" - + " \n" + + " \n" + " \n" + ""; @@ -160,20 +185,23 @@ public class CollectionConfigurationTest { public void setUp() throws Exception { final CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - final Collection testCollection = service.createCollection(TEST_COLLECTION); - UserManagementService ums = testCollection.getService(UserManagementService.class); - // change ownership to guest - final Account guest = ums.getAccount(GUEST_DB_USER); - ums.chown(guest, guest.getPrimaryGroup()); - ums.chmod("rwxr-xr-x"); + try (final Collection testCollection = service.createCollection(TEST_COLLECTION)) { + final UserManagementService ums = testCollection.getService(UserManagementService.class); + // change ownership to guest + final Account guest = ums.getAccount(GUEST_DB_USER); + ums.chown(guest, guest.getPrimaryGroup()); + ums.chmod("rwxr-xr-x"); + } - final Collection testConfCollection = service.createCollection(CONF_COLL_URI.toString()); - ums = testConfCollection.getService(UserManagementService.class); - // change ownership to guest - ums.chown(guest, guest.getPrimaryGroup()); - ums.chmod("rwxr-xr-x"); + try (final Collection testConfCollection = service.createCollection(CONF_COLL_URI.toString())) { + final UserManagementService ums = testConfCollection.getService(UserManagementService.class); + // change ownership to guest + final Account guest = ums.getAccount(GUEST_DB_USER); + ums.chown(guest, guest.getPrimaryGroup()); + ums.chmod("rwxr-xr-x"); - // configColl = cms.createCollection(CONF_COLL_URI.toString()); + // configColl = cms.createCollection(CONF_COLL_URI.toString()); + } } @After @@ -185,1115 +213,1504 @@ public void tearDown() throws XMLDBException { @Test public void collectionConfigurationService1() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { - //Configure collection automatically - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.configureCollection(CONFIG1); + //Configure collection automatically + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(CONFIG1); - //... then index document - XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class ); - doc.setContent(DOCUMENT_CONTENT); testCollection.storeResource(doc); + //... then index document + try (final XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + testCollection.storeResource(doc); + } - XPathQueryService service = testCollection.getService(XPathQueryService.class); + final XPathQueryService service = testCollection.getService(XPathQueryService.class); - //3 numeric values - ResourceSet result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals("3", result.getResource(0).getContent()); - //... but 1 string value - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals("1", result.getResource(0).getContent()); + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent()); + } + } + + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } //3 numeric values - result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); - assertEquals(3, result.getSize()); - //... but 1 string value - result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(3, result.getSize()); + } + + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(1, result.getSize()); + } + } } @Test public void testCollectionConfigurationService2() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - - // Add document.... - XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - testCollection.storeResource(doc); - - // ... then configure collection automatically - IndexQueryService idxConf = testCollection - .getService(IndexQueryService.class); - idxConf.configureCollection(CONFIG1); - - XPathQueryService service = testCollection - .getService(XPathQueryService.class); - - // No numeric values because we have no index - ResourceSet result = service.query("util:index-key-occurrences( /test/a, 1 ) "); - assertEquals(0, result.getSize()); - // No string value because we have no index - result = service.query("util:index-key-occurrences( /test/b, \"1\" ) "); - assertEquals(0, result.getSize()); - - // No numeric values because we have no index - result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); - assertEquals(0, result.getSize()); - // No string value because we have no index - result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); - assertEquals(0, result.getSize()); - - // ...let's activate the index - idxConf.reindexCollection(); - - //3 numeric values - result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals("3", result.getResource(0).getContent()); - //... but 1 string value - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals("1", result.getResource(0).getContent()); - - // 3 numeric values - result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); - assertEquals(3, result.getSize()); - // ... but 1 string value - result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); - assertEquals(1, result.getSize()); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + + // Add document.... + try (final XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + testCollection.storeResource(doc); + } + + // ... then configure collection automatically + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(CONFIG1); + + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + + // No numeric values because we have no index + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + assertEquals(0, result.getSize()); + } + + // No string value because we have no index + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + assertEquals(0, result.getSize()); + } + + // No numeric values because we have no index + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(0, result.getSize()); + } + + // No string value because we have no index + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(0, result.getSize()); + } + + // ...let's activate the index + idxConf.reindexCollection(); + + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent()); + } + } + + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } + + // 3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(3, result.getSize()); + } + + // ... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(1, result.getSize()); + } + } } @Test public void collectionConfigurationService3() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - - //Configure collection *manually* - storeConfiguration(CONF_COLL_URI, CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE_URI, CONFIG1); - - //... then index document - XMLResource doc = - testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class ); - doc.setContent(DOCUMENT_CONTENT); testCollection.storeResource(doc); - - XPathQueryService service = testCollection.getService(XPathQueryService.class); - - //3 numeric values - ResourceSet result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals(1, result.getSize()); - assertEquals("3", result.getResource(0).getContent()); - //... but 1 string value - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); - - //3 numeric values - result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); - assertEquals(3, result.getSize()); - //... but 1 string value - result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); - assertEquals(1, result.getSize()); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + + //Configure collection *manually* + storeConfiguration(CONF_COLL_URI, CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE_URI, CONFIG1); + + //... then index document + try (XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + testCollection.storeResource(doc); + } + + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent()); + } + } + + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } + + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(3, result.getSize()); + } + + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(1, result.getSize()); + } + } } - @Test - public void collectionConfigurationService4() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - - // Add document.... - XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - testCollection.storeResource(doc); - - // ... then configure collection *manually* - storeConfiguration(CONF_COLL_URI, CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE_URI, CONFIG1); - - XPathQueryService service = testCollection - .getService(XPathQueryService.class); - - // No numeric values because we have no index - ResourceSet result = service.query("util:index-key-occurrences( /test/a, 1 ) "); - assertEquals(0, result.getSize()); - // No string value because we have no index - result = service.query("util:index-key-occurrences( /test/b, \"1\" ) "); - assertEquals(0, result.getSize()); - - // No numeric values because we have no index - result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); - assertEquals(0, result.getSize()); - // No string value because we have no index - result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); - assertEquals(0, result.getSize()); - - // ...let's activate the index - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.reindexCollection(); - - //3 numeric values - result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals("3", result.getResource(0).getContent()); - //... but 1 string value - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals("1", result.getResource(0).getContent()); - - // 3 numeric values - result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); - assertEquals(3, result.getSize()); - // ... but 1 string value - result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); - assertEquals(1, result.getSize()); + @Test + public void collectionConfigurationService4() throws XMLDBException { + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + + // Add document.... + try (final XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + testCollection.storeResource(doc); + } + + // ... then configure collection *manually* + storeConfiguration(CONF_COLL_URI, CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE_URI, CONFIG1); + + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + + // No numeric values because we have no index + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + assertEquals(0, result.getSize()); + } + + // No string value because we have no index + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + assertEquals(0, result.getSize()); + } + + // No numeric values because we have no index + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(0, result.getSize()); + } + + // No string value because we have no index + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(0, result.getSize()); + } + + // ...let's activate the index + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.reindexCollection(); + + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent()); + } + } + + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } + + // 3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(3, result.getSize()); + } + + // ... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(1, result.getSize()); + } + } } @Test public void collectionConfigurationService5() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - - //Configure collection *manually* - XmldbURI configurationFileName = XmldbURI.create(CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE); - storeConfiguration(CONF_COLL_URI, configurationFileName, CONFIG1); - - // ... then configure collection automatically - IndexQueryService idxConf = testCollection - .getService(IndexQueryService.class); - idxConf.configureCollection(CONFIG1); - - // Add document.... - XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - testCollection.storeResource(doc); - - XPathQueryService service = testCollection.getService(XPathQueryService.class); - - //our config file - ResourceSet result = service.query("xmldb:get-child-resources('" + CONF_COLL_URI + "')"); - assertEquals(configurationFileName.toString(), result.getResource(0).getContent()); - - //3 numeric values - result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals("3", result.getResource(0).getContent()); - //... but 1 string value - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals("1", result.getResource(0).getContent()); - - // 3 numeric values - result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); - assertEquals(3, result.getSize()); - // ... but 1 string value - result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); - assertEquals(1, result.getSize()); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + + //Configure collection *manually* + final XmldbURI configurationFileName = XmldbURI.create(CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE); + storeConfiguration(CONF_COLL_URI, configurationFileName, CONFIG1); + + // ... then configure collection automatically + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(CONFIG1); + + // Add document.... + try (final XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + testCollection.storeResource(doc); + } + + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + + //our config file + try (final EXistResourceSet result = (EXistResourceSet) service.query("xmldb:get-child-resources('" + CONF_COLL_URI + "')")) { + try (final Resource resource = result.getResource(0)) { + assertEquals(configurationFileName.toString(), resource.getContent()); + } + } + + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent()); + } + } + + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } + + // 3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(3, result.getSize()); + } + + // ... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(1, result.getSize()); + } + } } @Test public void collectionConfigurationService6() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - - // Add document.... - XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - testCollection.storeResource(doc); - - //... then configure collection *manually* - XmldbURI configurationFileName = XmldbURI.create(CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE); - storeConfiguration(CONF_COLL_URI, configurationFileName, CONFIG1); - - //... then configure collection automatically - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.configureCollection(CONFIG1); - - XPathQueryService service = testCollection.getService(XPathQueryService.class); - - //our config file - ResourceSet result = service.query("xmldb:get-child-resources('" + - CONF_COLL_URI + - "')"); - assertEquals(configurationFileName.toString(), result.getResource(0).getContent()); - - // No numeric values because we have no index - result = service.query("util:index-key-occurrences( /test/a, 1 ) "); - assertEquals(0, result.getSize()); - // No string value because we have no index - result = service.query("util:index-key-occurrences( /test/b, \"1\" ) "); - assertEquals(0, result.getSize()); - - // No numeric values because we have no index - result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); - assertEquals(0, result.getSize()); - // No string value because we have no index - result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); - assertEquals(0, result.getSize()); - - // ...let's activate the index - idxConf.reindexCollection(); - - //WARNING : the code hereafter used to *not* work whereas - //testCollectionConfigurationService4 did. - //Adding confMgr.invalidateAll(getName()); in Collection.storeInternal solved the problem - //Strange case that needs investigations... -pb - - //3 numeric values - result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals("3", result.getResource(0).getContent()); - //... but 1 string value - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals("1", result.getResource(0).getContent()); - - // 3 numeric values - result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); - assertEquals(3, result.getSize()); - // ... but 1 string value - result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); - assertEquals(1, result.getSize()); - } + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { - /** Check if configurations are properly passed down the collection hierarchy. */ - @Test - public void collectionConfigurationService7() throws XMLDBException { + // Add document.... + try (final XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + testCollection.storeResource(doc); + } - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - - CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); - Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString()); - UserManagementService ums = sub2.getService(UserManagementService.class); - ums.chmod("rwxr-xr-x"); + //... then configure collection *manually* + final XmldbURI configurationFileName = XmldbURI.create(CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE); + storeConfiguration(CONF_COLL_URI, configurationFileName, CONFIG1); - //Configure collection automatically - // sub2 should inherit its index configuration from the top collection - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.configureCollection(CONFIG1); + //... then configure collection automatically + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(CONFIG1); - //... then index document - XMLResource doc = sub2.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - sub2.storeResource(doc); + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + + //our config file + try (final EXistResourceSet result = (EXistResourceSet) service.query("xmldb:get-child-resources('" + CONF_COLL_URI + "')")) { + try (final Resource resource = result.getResource(0)) { + assertEquals(configurationFileName.toString(), resource.getContent()); + } + } - XPathQueryService service = sub2.getService(XPathQueryService.class); + // No numeric values because we have no index + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + assertEquals(0, result.getSize()); + } - //3 numeric values - ResourceSet result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals("3", result.getResource(0).getContent()); - //... but 1 string value - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals("1", result.getResource(0).getContent()); + // No string value because we have no index + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + assertEquals(0, result.getSize()); + } - //3 numeric values - result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); - assertEquals(3, result.getSize()); - //... but 1 string value - result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); - assertEquals(1, result.getSize()); + // No numeric values because we have no index + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(0, result.getSize()); + } + + // No string value because we have no index + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(0, result.getSize()); + } + + // ...let's activate the index + idxConf.reindexCollection(); + + //WARNING : the code hereafter used to *not* work whereas + //testCollectionConfigurationService4 did. + //Adding confMgr.invalidateAll(getName()); in Collection.storeInternal solved the problem + //Strange case that needs investigations... -pb + + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent()); + } + } + + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } + + // 3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(3, result.getSize()); + } + + // ... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(1, result.getSize()); + } + } + } + + /** Check if configurations are properly passed down the collection hierarchy. */ + @Test + public void collectionConfigurationService7() throws XMLDBException { + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + + final CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); + try (Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString())) { + final UserManagementService ums = sub2.getService(UserManagementService.class); + ums.chmod("rwxr-xr-x"); + + //Configure collection automatically + // sub2 should inherit its index configuration from the top collection + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(CONFIG1); + + //... then index document + try (final XMLResource doc = sub2.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + sub2.storeResource(doc); + } + + final XPathQueryService service = sub2.getService(XPathQueryService.class); + + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent()); + } + } + + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } + + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(3, result.getSize()); + } + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(1, result.getSize()); + } + } + } } /** Overwrite configuration in a sub collection */ @Test public void collectionConfigurationService8() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - - CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); - Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString()); - UserManagementService ums = sub2.getService(UserManagementService.class); - ums.chmod("rwxr-xr-x"); - - //Configure collection automatically - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.configureCollection(CONFIG1); - - // Overwrite main configuration with an empty configuration in the subcollection - idxConf = sub2.getService(IndexQueryService.class); - idxConf.configureCollection(EMPTY_CONFIG); - - //... then index document - XMLResource doc = sub2.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - sub2.storeResource(doc); - - XPathQueryService service = sub2.getService(XPathQueryService.class); - - // index should be empty - ResourceSet result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals(0, result.getSize()); - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals(0, result.getSize()); - - result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); - assertEquals(0, result.getSize()); - result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); - assertEquals(0, result.getSize()); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + + final CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); + try (final Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString())) { + final UserManagementService ums = sub2.getService(UserManagementService.class); + ums.chmod("rwxr-xr-x"); + + //Configure collection automatically + IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(CONFIG1); + + // Overwrite main configuration with an empty configuration in the subcollection + idxConf = sub2.getService(IndexQueryService.class); + idxConf.configureCollection(EMPTY_CONFIG); + + //... then index document + try (final XMLResource doc = sub2.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + sub2.storeResource(doc); + } + + final XPathQueryService service = sub2.getService(XPathQueryService.class); + + // index should be empty + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + assertEquals(0, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + assertEquals(0, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(0, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(0, result.getSize()); + } + } + } } /** Overwrite configuration in a sub collection 2 times */ @Test public void collectionConfigurationService9() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); - Collection sub1 = cms.createCollection(COLLECTION_SUB1.toString()); - UserManagementService ums = sub1.getService(UserManagementService.class); - ums.chmod("rwxr-xr-x"); - Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString()); - ums = sub2.getService(UserManagementService.class); - ums.chmod("rwxr-xr-x"); - - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.configureCollection(CONFIG1); - - // Overwrite main configuration with an empty configuration in the subcollection - idxConf = sub1.getService(IndexQueryService.class); - idxConf.configureCollection(EMPTY_CONFIG); - - // Overwrite sub1 configuration in sub2 - idxConf = sub2.getService(IndexQueryService.class); - idxConf.configureCollection(CONFIG3); - - //... then store document into sub1 - XMLResource doc = sub1.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - sub1.storeResource(doc); - - XPathQueryService service = sub1.getService(XPathQueryService.class); - - // sub1 has empty configuration, so index should be empty as well - ResourceSet result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals(0, result.getSize()); - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals(0, result.getSize()); - - result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); - assertEquals(0, result.getSize()); - result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); - assertEquals(0, result.getSize()); - - // remove document in sub1 and restore it in sub2 - sub1.removeResource(doc); - doc = sub2.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - sub2.storeResource(doc); - - service = sub2.getService(XPathQueryService.class); - - // sub2 only has an index on /test/a, but not on /test/b - - //3 numeric values - result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals("3", result.getResource(0).getContent()); - //... but 1 string value - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals(0, result.getSize()); - - // 3 numeric values - result = service.query("util:qname-index-lookup( xs:QName(\"a\"), 1 ) "); - assertEquals(3, result.getSize()); - // ... but 1 string value - result = service.query("util:qname-index-lookup( xs:QName(\"b\"), \"1\" ) "); - assertEquals(0, result.getSize()); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + final CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); + + try (final Collection sub1 = cms.createCollection(COLLECTION_SUB1.toString())) { + UserManagementService ums = sub1.getService(UserManagementService.class); + ums.chmod("rwxr-xr-x"); + + try (final Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString())) { + ums = sub2.getService(UserManagementService.class); + ums.chmod("rwxr-xr-x"); + + IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(CONFIG1); + + // Overwrite main configuration with an empty configuration in the subcollection + idxConf = sub1.getService(IndexQueryService.class); + idxConf.configureCollection(EMPTY_CONFIG); + + // Overwrite sub1 configuration in sub2 + idxConf = sub2.getService(IndexQueryService.class); + idxConf.configureCollection(CONFIG3); + + //... then store document into sub1 + try (final XMLResource doc = sub1.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + sub1.storeResource(doc); + + final XPathQueryService service = sub1.getService(XPathQueryService.class); + + // sub1 has empty configuration, so index should be empty as well + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + assertEquals(0, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + assertEquals(0, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(0, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(0, result.getSize()); + } + + // remove document in sub1 and restore it in sub2 + sub1.removeResource(doc); + } + + try (final XMLResource doc = sub2.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + sub2.storeResource(doc); + + final XPathQueryService service = sub2.getService(XPathQueryService.class); + + // sub2 only has an index on /test/a, but not on /test/b + + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent()); + } + } + + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + assertEquals(0, result.getSize()); + } + + // 3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(3, result.getSize()); + } + + // ... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(0, result.getSize()); + } + } + } + } + } } /** Remove config document */ @Test public void collectionConfigurationService10() throws XMLDBException { + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - - CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); - Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString()); - UserManagementService ums = sub2.getService(UserManagementService.class); - ums.chmod("rwxr-xr-x"); + final CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); + try (final Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString())) { + final UserManagementService ums = sub2.getService(UserManagementService.class); + ums.chmod("rwxr-xr-x"); - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.configureCollection(CONFIG1); + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(CONFIG1); - //... then index document - XMLResource doc = - sub2.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - sub2.storeResource(doc); + //... then index document + try (final XMLResource doc = sub2.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + sub2.storeResource(doc); + } - XPathQueryService service = sub2.getService(XPathQueryService.class); + final XPathQueryService service = sub2.getService(XPathQueryService.class); - //3 numeric values - ResourceSet result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals("3", result.getResource(0).getContent()); - //... but 1 string value - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals("1", result.getResource(0).getContent()); + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent()); + } + } - //3 numeric values - result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); - assertEquals(3, result.getSize()); - //... but 1 string value - result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); - assertEquals(1, result.getSize()); - - // remove config document thus dropping the configuration - Collection confCol = DatabaseManager.getCollection("xmldb:exist://" + CONF_COLL_URI.toString(), ADMIN_DB_USER, ADMIN_DB_PWD); - Resource confDoc = confCol.getResource(DEFAULT_COLLECTION_CONFIG_FILE); - assertNotNull(confDoc); - confCol.removeResource(confDoc); + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } + + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(3, result.getSize()); + } + + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(1, result.getSize()); + } + + // remove config document thus dropping the configuration + try (final Collection confCol = DatabaseManager.getCollection("xmldb:exist://" + CONF_COLL_URI.toString(), ADMIN_DB_USER, ADMIN_DB_PWD); + final Resource confDoc = confCol.getResource(DEFAULT_COLLECTION_CONFIG_FILE)) { + assertNotNull(confDoc); + confCol.removeResource(confDoc); + } // cms = confCol.getService(CollectionManagementService.class); // cms.removeCollection("."); - idxConf.reindexCollection(); + idxConf.reindexCollection(); + + // index should be empty since configuration was removed + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + assertEquals(0, result.getSize()); + } - // index should be empty since configuration was removed - result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals(0, result.getSize()); - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + assertEquals(0, result.getSize()); + } - result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); - assertEquals(0, result.getSize()); - result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(0, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(0, result.getSize()); + } + } + } } /** Remove config collection */ @Test public void collectionConfigurationService11() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { - CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); - Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString()); - UserManagementService ums = sub2.getService(UserManagementService.class); - ums.chmod("rwxr-xr-x"); + final CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); + try (final Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString())) { + final UserManagementService ums = sub2.getService(UserManagementService.class); + ums.chmod("rwxr-xr-x"); - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.configureCollection(CONFIG1); + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(CONFIG1); - //... then index document - XMLResource doc = sub2.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - sub2.storeResource(doc); + //... then index document + try (final XMLResource doc = sub2.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + sub2.storeResource(doc); + } - XPathQueryService service = sub2.getService(XPathQueryService.class); + final XPathQueryService service = sub2.getService(XPathQueryService.class); - //3 numeric values - ResourceSet result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals("3", result.getResource(0).getContent()); - //... but 1 string value - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals("1", result.getResource(0).getContent()); + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent()); + } + } - //3 numeric values - result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); - assertEquals(3, result.getSize()); - //... but 1 string value - result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); - assertEquals(1, result.getSize()); - - // remove config document thus dropping the configuration - Collection confCol = DatabaseManager.getCollection("xmldb:exist://" + CONF_COLL_URI.toString(), ADMIN_DB_USER, ADMIN_DB_PWD); - Resource confDoc = confCol.getResource(DEFAULT_COLLECTION_CONFIG_FILE); - assertNotNull(confDoc); - confCol.removeResource(confDoc); - - idxConf.reindexCollection(); - - // index should be empty since configuration was removed - result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals(0, result.getSize()); - result = service.query("util:index-key-occurrences(/test/b, \"1\")"); - assertEquals(0, result.getSize()); - - result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); - assertEquals(0, result.getSize()); - result = service.query("util:qname-index-lookup(xs:QName(\"b\"), \"1\" ) "); - assertEquals(0, result.getSize()); + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } + + //3 numeric values + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(3, result.getSize()); + } + + //... but 1 string value + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(1, result.getSize()); + } + + // remove config document thus dropping the configuration + try (final Collection confCol = DatabaseManager.getCollection("xmldb:exist://" + CONF_COLL_URI.toString(), ADMIN_DB_USER, ADMIN_DB_PWD); + final Resource confDoc = confCol.getResource(DEFAULT_COLLECTION_CONFIG_FILE)) { + assertNotNull(confDoc); + confCol.removeResource(confDoc); + } + + idxConf.reindexCollection(); + + // index should be empty since configuration was removed + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + assertEquals(0, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/b, '1')")) { + assertEquals(0, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(0, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('b'), '1')")) { + assertEquals(0, result.getSize()); + } + } + } } @Test public void invalidConfiguration1() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { - CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); - Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString()); - UserManagementService ums = sub2.getService(UserManagementService.class); - ums.chmod("rwxr-xr-x"); + final CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); + try (final Collection sub2 = cms.createCollection(COLLECTION_SUB2.toString())) { + final UserManagementService ums = sub2.getService(UserManagementService.class); + ums.chmod("rwxr-xr-x"); - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.configureCollection(INVALID_CONFIG1); + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(INVALID_CONFIG1); - //... then index document - XMLResource doc = sub2.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class); - doc.setContent(DOCUMENT_CONTENT); - sub2.storeResource(doc); + //... then index document + try (final XMLResource doc = sub2.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT); + sub2.storeResource(doc); + } - XPathQueryService service = sub2.getService(XPathQueryService.class); + final XPathQueryService service = sub2.getService(XPathQueryService.class); - // index should be empty since configuration was invalid - ResourceSet result = service.query("util:index-key-occurrences(/test/a, 1)"); - assertEquals(0, result.getSize()); + // index should be empty since configuration was invalid + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/a, 1)")) { + assertEquals(0, result.getSize()); + } - result = service.query("util:qname-index-lookup(xs:QName(\"a\"), 1 ) "); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:qname-index-lookup(xs:QName('a'), 1)")) { + assertEquals(0, result.getSize()); + } + } + } } @Test @Ignore public void rangeIndex1() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - - //Configure collection automatically - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.configureCollection(CONFIG2); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { - //... then index document - XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class ); - doc.setContent(DOCUMENT_CONTENT2); - testCollection.storeResource(doc); + //Configure collection automatically + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(CONFIG2); - XPathQueryService service = testCollection.getService(XPathQueryService.class); + //... then index document + try (final XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT2); + testCollection.storeResource(doc); + } - ResourceSet result = service.query("util:index-key-occurrences(/test/c, xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") )"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + final XPathQueryService service = testCollection.getService(XPathQueryService.class); - result = service.query("util:index-type(/test/c)"); - assertEquals("xs:dateTime", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/c, xs:dateTime('2002-12-07T12:20:46.275+01:00') )")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/d, xs:double(1) )"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/c)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:dateTime", resource.getContent()); + } + } - result = service.query("util:index-type(/test/d)"); - assertEquals("xs:double", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/d, xs:double(1) )")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/e, xs:float(1) )"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/d)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:double", resource.getContent()); + } + } - result = service.query("util:index-type(/test/e)"); - assertEquals("xs:float", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/e, xs:float(1) )")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/f, true())"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/e)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:float", resource.getContent()); + } + } - result = service.query("util:index-type(/test/f)"); - assertEquals("xs:boolean", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/f, true())")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/g, xs:integer(1))"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/f)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:boolean", resource.getContent()); + } + } - result = service.query("util:index-type(/test/g)"); - assertEquals("xs:integer", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/g, xs:integer(1))")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/h, '1')"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/g)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:integer", resource.getContent()); + } + } - result = service.query("util:index-type(/test/h)"); - assertEquals("xs:string", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/h, '1')")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("/test/c[(# exist:force-index-use #) { . = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/h)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:string", resource.getContent()); + } + } - result = service.query("/test[(# exist:force-index-use #) { c = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/c[(# exist:force-index-use #) { . = xs:dateTime('2002-12-07T12:20:46.275+01:00') }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test/d[(# exist:force-index-use #) { . = xs:double(1) }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { c = xs:dateTime('2002-12-07T12:20:46.275+01:00') }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { d = xs:double(1) }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/d[(# exist:force-index-use #) { . = xs:double(1) }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test/e[(# exist:force-index-use #) { . = xs:float(1) }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { d = xs:double(1) }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { e = xs:float(1) }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/e[(# exist:force-index-use #) { . = xs:float(1) }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test/f[(# exist:force-index-use #) { . = true() }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { e = xs:float(1) }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { f = true() }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/f[(# exist:force-index-use #) { . = true() }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test/g[(# exist:force-index-use #) { . = 1 }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { f = true() }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { g = 1 }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/g[(# exist:force-index-use #) { . = 1 }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test/h[(# exist:force-index-use #) { . = '1' }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { g = 1 }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { h = '1' }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/h[(# exist:force-index-use #) { . = '1' }]")) { + assertEquals(1, result.getSize()); + } - boolean exceptionCaught = false; - try { - result = service.query("/test[(# exist:force-index-use #) { contains(d, '1') }]"); - assertEquals(0, result.getSize()); - } catch (XMLDBException e) { - exceptionCaught = true; - } - assertTrue("contains() should not use index of type xs:double", exceptionCaught); - exceptionCaught = false; - try { - result = service.query("/test[(# exist:force-index-use #) { matches(d, '1') }]"); - assertEquals(0, result.getSize()); - } catch (XMLDBException e) { - exceptionCaught = true; - } - assertTrue("matches() should not use index of type xs:double", exceptionCaught); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { h = '1' }]")) { + assertEquals(1, result.getSize()); + } + + assertThrows(XMLDBException.class, () -> { + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { contains(d, '1') }]")) { + assertEquals(0, result.getSize()); + } + }, "contains() should not use index of type xs:double"); - result = service.query("/test[matches(h, '1')]"); - assertEquals(1, result.getSize()); + assertThrows(XMLDBException.class, () -> { + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { matches(d, '1') }]")) { + assertEquals(0, result.getSize()); + } + }, "matches() should not use index of type xs:double"); + + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[matches(h, '1')]")) { + assertEquals(1, result.getSize()); + } + } } @Test @Ignore public void rangeIndex2() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { - //Configure collection automatically - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.configureCollection(QNAME_CONFIG2); + //Configure collection automatically + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(QNAME_CONFIG2); - //... then index document - XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class ); - doc.setContent(DOCUMENT_CONTENT2); - testCollection.storeResource(doc); + //... then index document + try (final XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT2); + testCollection.storeResource(doc); + } - XPathQueryService service = testCollection.getService(XPathQueryService.class); + final XPathQueryService service = testCollection.getService(XPathQueryService.class); - ResourceSet result = service.query("util:index-key-occurrences(/test/c, xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") )"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/c, xs:dateTime('2002-12-07T12:20:46.275+01:00'))")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-type(/test/c)"); - assertEquals("xs:dateTime", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/c)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:dateTime", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/d, xs:double(1) )"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/d, xs:double(1) )")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-type(/test/d)"); - assertEquals("xs:double", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/d)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:double", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/e, xs:float(1) )"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/e, xs:float(1))")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-type(/test/e)"); - assertEquals("xs:float", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/e)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:float", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/f, true())"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/f, true())")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-type(/test/f)"); - assertEquals("xs:boolean", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/f)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:boolean", resource.getContent()); + } + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/g, xs:integer(1))")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/g, xs:integer(1))"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/g)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:integer", resource.getContent()); + } + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/h, '1')")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-type(/test/g)"); - assertEquals("xs:integer", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/h)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:string", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/h, '1')"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test/c[. = xs:dateTime('2002-12-07T12:20:46.275+01:00')] }")) { + assertEquals(1, result.getSize()); + } - result = service.query("util:index-type(/test/h)"); - assertEquals("xs:string", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test[c = xs:dateTime('2002-12-07T12:20:46.275+01:00')] }")) { + assertEquals(1, result.getSize()); + } - result = service.query("(# exist:force-index-use #) { /test/c[. = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\")] }"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test/d[. = xs:double(1)] }")) { + assertEquals(1, result.getSize()); + } - result = service.query("(# exist:force-index-use #) { /test[c = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\")] }"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test[d = xs:double(1)] }")) { + assertEquals(1, result.getSize()); + } - result = service.query("(# exist:force-index-use #) { /test/d[. = xs:double(1)] }"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test/e[. = xs:float(1)] }")) { + assertEquals(1, result.getSize()); + } - result = service.query("(# exist:force-index-use #) { /test[d = xs:double(1)] }"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test[e = xs:float(1)] }")) { + assertEquals(1, result.getSize()); + } - result = service.query("(# exist:force-index-use #) { /test/e[. = xs:float(1)] }"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test/f[. = true()] }")) { + assertEquals(1, result.getSize()); + } - result = service.query("(# exist:force-index-use #) { /test[e = xs:float(1)] }"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test[f = true()] }")) { + assertEquals(1, result.getSize()); + } - result = service.query("(# exist:force-index-use #) { /test/f[. = true()] }"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test/g[. = 1] }")) { + assertEquals(1, result.getSize()); + } - result = service.query("(# exist:force-index-use #) { /test[f = true()] }"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test[g = 1] }")) { + assertEquals(1, result.getSize()); + } - result = service.query("(# exist:force-index-use #) { /test/g[. = 1] }"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test/h[. = '1'] }")) { + assertEquals(1, result.getSize()); + } - result = service.query("(# exist:force-index-use #) { /test[g = 1] }"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test[h = '1'] }")) { + assertEquals(1, result.getSize()); + } - result = service.query("(# exist:force-index-use #) { /test/h[. = '1'] }"); - assertEquals(1, result.getSize()); + assertThrows(XMLDBException.class, () -> { + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test[contains(d, '1')] }")) { + assertEquals(0, result.getSize()); + } + }, "contains() should not use index of type xs:double"); - result = service.query("(# exist:force-index-use #) { /test[h = '1'] }"); - assertEquals(1, result.getSize()); + assertThrows(XMLDBException.class, () -> { + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test[matches(d, '1')] }")) { + assertEquals(0, result.getSize()); + } + }, "matches() should not use index of type xs:double"); - boolean exceptionCaught = false; - try { - result = service.query("(# exist:force-index-use #) { /test[contains(d, '1')] }"); - assertEquals(0, result.getSize()); - } catch (XMLDBException e) { - exceptionCaught = true; - } - assertTrue("contains() should not use index of type xs:double", exceptionCaught); - exceptionCaught = false; - try { - result = service.query("(# exist:force-index-use #) { /test[matches(d, '1')] }"); - assertEquals(0, result.getSize()); - } catch (XMLDBException e) { - exceptionCaught = true; + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[matches(h, '1')]")) { + assertEquals(1, result.getSize()); + } } - assertTrue("matches() should not use index of type xs:double", exceptionCaught); - - result = service.query("/test[matches(h, '1')]"); - assertEquals(1, result.getSize()); } @Test @Ignore public void rangeIndex3() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - - //Configure collection automatically - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.configureCollection(QNAME_CONFIG); - - //... then index document - XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class ); - doc.setContent(DOCUMENT_CONTENT3); - testCollection.storeResource(doc); - - EXistXQueryService service = testCollection.getService(EXistXQueryService.class); - // the query optimizer cannot optimize the following general comparison as - // the context qname is unknown. however, the available qname index should still be used. - ResourceSet result = service.query("(# exist:force-index-use #) { for $t in /test/a where $t = 1 return $t}"); - assertEquals(1, result.getSize()); - result = service.query("(# exist:force-index-use #) { for $t in /test/d where contains($t, 'x') return $t}"); - assertEquals(1, result.getSize()); - result = service.query("(# exist:force-index-use #) { for $t in /test/d where matches($t, 'x$') return $t}"); - assertEquals(1, result.getSize()); - - // left operand to comparison uses nodes from different elements, both having an index defined - // by qname: use qname index - result = service.query("(# exist:force-index-use #) { for $t in /test/(a|b) where $t = 1 return $t}"); - assertEquals(2, result.getSize()); - result = service.query("(# exist:force-index-use #) { for $t in /test/(d|e) where contains($t, 'x') return $t}"); - assertEquals(2, result.getSize()); - result = service.query("(# exist:force-index-use #) { for $t in /test/(d|e) where matches($t, 'x$') return $t}"); - assertEquals(2, result.getSize()); - - // left operand to comparison uses nodes from different elements with mixed indexes, - // some defined on qname, one defined by path: comparison needs to scan all 3 indexes. - result = service.query("(# exist:force-index-use #) { for $t in /test/(a|b|c) where $t = 1 return $t}"); - assertEquals(3, result.getSize()); - result = service.query("(# exist:force-index-use #) { for $t in /test/(d|e|f) where contains($t, 'x') return $t}"); - assertEquals(3, result.getSize()); - result = service.query("(# exist:force-index-use #) { for $t in /test/(d|e|f) where matches($t, 'x$') return $t}"); - assertEquals(3, result.getSize()); - - // left operand has index defined on path. other elements in the collection use indexes - // on qname: comparison needs to scan all index types. - result = service.query("(# exist:force-index-use #) { for $t in /test/c where $t = 1 return $t}"); - assertEquals(1, result.getSize()); - - // simple comparison, left operand has index defined on path. - result = service.query("(# exist:force-index-use #) { /test[c = 1] }"); - assertEquals(1, result.getSize()); - result = service.query("(# exist:force-index-use #) { /test[matches(d, 'x')] }"); - assertEquals(1, result.getSize()); - - // wrong index type: can't use fn:contains with an integer index - boolean exceptionCaught = false; - try { - result = service.query("(# exist:force-index-use #) { for $t in /test/c where contains($t, '1') return $t}"); - assertEquals(1, result.getSize()); - } catch (XMLDBException e) { - exceptionCaught = true; - } - assertTrue(exceptionCaught); - - // wrong index type: can't use fn:matches with an integer index - exceptionCaught = false; - try { - result = service.query("(# exist:force-index-use #) { for $t in /test/c where matches($t, '1') return $t}"); - assertEquals(1, result.getSize()); - } catch (XMLDBException e) { - exceptionCaught = true; + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + + //Configure collection automatically + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(QNAME_CONFIG); + + //... then index document + try (final XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT3); + testCollection.storeResource(doc); + } + + final EXistXQueryService service = testCollection.getService(EXistXQueryService.class); + // the query optimizer cannot optimize the following general comparison as + // the context qname is unknown. however, the available qname index should still be used. + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { for $t in /test/a where $t = 1 return $t}")) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { for $t in /test/d where contains($t, 'x') return $t}")) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { for $t in /test/d where matches($t, 'x$') return $t}")) { + assertEquals(1, result.getSize()); + } + + // left operand to comparison uses nodes from different elements, both having an index defined + // by qname: use qname index + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { for $t in /test/(a|b) where $t = 1 return $t}")) { + assertEquals(2, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { for $t in /test/(d|e) where contains($t, 'x') return $t}")) { + assertEquals(2, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { for $t in /test/(d|e) where matches($t, 'x$') return $t}")) { + assertEquals(2, result.getSize()); + } + + // left operand to comparison uses nodes from different elements with mixed indexes, + // some defined on qname, one defined by path: comparison needs to scan all 3 indexes. + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { for $t in /test/(a|b|c) where $t = 1 return $t}")) { + assertEquals(3, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { for $t in /test/(d|e|f) where contains($t, 'x') return $t}")) { + assertEquals(3, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { for $t in /test/(d|e|f) where matches($t, 'x$') return $t}")) { + assertEquals(3, result.getSize()); + } + + // left operand has index defined on path. other elements in the collection use indexes + // on qname: comparison needs to scan all index types. + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { for $t in /test/c where $t = 1 return $t}")) { + assertEquals(1, result.getSize()); + } + + // simple comparison, left operand has index defined on path. + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test[c = 1] }")) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test[matches(d, 'x')] }")) { + assertEquals(1, result.getSize()); + } + + // wrong index type: can't use fn:contains with an integer index + assertThrows(XMLDBException.class, () -> { + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { for $t in /test/c where contains($t, '1') return $t}")) { + assertEquals(1, result.getSize()); + } + }); + + // wrong index type: can't use fn:matches with an integer index + assertThrows(XMLDBException.class, () -> { + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { for $t in /test/c where matches($t, '1') return $t}")) { + assertEquals(1, result.getSize()); + } + }); + + // wrong index type: can't use fn:matches with an integer index + assertThrows(XMLDBException.class, () -> { + try (final EXistResourceSet result = (EXistResourceSet) service.query("(# exist:force-index-use #) { /test[matches(c, '1')] }")) { + assertEquals(1, result.getSize()); + } + }); } - assertTrue(exceptionCaught); - - // wrong index type: can't use fn:matches with an integer index - exceptionCaught = false; - try { - result = service.query("(# exist:force-index-use #) { /test[matches(c, '1')] }"); - assertEquals(1, result.getSize()); - } catch (XMLDBException e) { - exceptionCaught = true; - } - assertTrue(exceptionCaught); } @Test @Ignore public void rangeIndexOverAttributes() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - - //Configure collection automatically - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.configureCollection(CONFIG2); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { - //... then index document - XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class ); - doc.setContent(DOCUMENT_CONTENT2); - testCollection.storeResource(doc); + //Configure collection automatically + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(CONFIG2); - XPathQueryService service = testCollection.getService(XPathQueryService.class); + //... then index document + try (final XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT2); + testCollection.storeResource(doc); + } - ResourceSet result = service.query("//test[@x = 0]"); - assertEquals(1, result.getSize()); + final XPathQueryService service = testCollection.getService(XPathQueryService.class); - result = service.query("//test[@x eq 0]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("//test[@x = 0]")) { + assertEquals(1, result.getSize()); + } - result = service.query("//test[(# exist:force-index-use #) { @x = 0 }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("//test[@x eq 0]")) { + assertEquals(1, result.getSize()); + } - result = service.query("//test[(# exist:force-index-use #) { @x eq 0 }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("//test[(# exist:force-index-use #) { @x = 0 }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("util:index-key-occurrences(/test//@c, xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") )"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("//test[(# exist:force-index-use #) { @x eq 0 }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("util:index-type(/test//@c)"); - assertEquals("xs:dateTime", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test//@c, xs:dateTime('2002-12-07T12:20:46.275+01:00'))")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/c/@c, xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") )"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test//@c)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:dateTime", resource.getContent()); + } + } - result = service.query("util:index-type(/test/c/@c)"); - assertEquals("xs:dateTime", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/c/@c, xs:dateTime('2002-12-07T12:20:46.275+01:00'))")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test//@d, xs:double(1) )"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/c/@c)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:dateTime", resource.getContent()); + } + } - result = service.query("util:index-type(/test//@d)"); - assertEquals("xs:double", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test//@d, xs:double(1))")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/d/@d, xs:double(1) )"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test//@d)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:double", resource.getContent()); + } + } - result = service.query("util:index-type(/test/d/@d)"); - assertEquals("xs:double", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/d/@d, xs:double(1))")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test//@e, xs:float(1) )"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/d/@d)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:double", resource.getContent()); + } + } - result = service.query("util:index-type(/test//@e)"); - assertEquals("xs:float", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test//@e, xs:float(1))")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/e/@e, xs:float(1) )"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test//@e)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:float", resource.getContent()); + } + } - result = service.query("util:index-type(/test/e/@e)"); - assertEquals("xs:float", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/e/@e, xs:float(1))")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test//@f, true())"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/e/@e)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:float", resource.getContent()); + } + } - result = service.query("util:index-type(/test//@f)"); - assertEquals("xs:boolean", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test//@f, true())")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/f/@f, true())"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test//@f)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:boolean", resource.getContent()); + } + } - result = service.query("util:index-type(/test/f/@f)"); - assertEquals("xs:boolean", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/f/@f, true())")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test//@g, xs:integer(1))"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/f/@f)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:boolean", resource.getContent()); + } + } - result = service.query("util:index-type(/test//@g)"); - assertEquals("xs:integer", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test//@g, xs:integer(1))")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/g/@g, xs:integer(1))"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test//@g)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:integer", resource.getContent()); + } + } - result = service.query("util:index-type(/test/g/@g)"); - assertEquals("xs:integer", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/g/@g, xs:integer(1))")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test//@h, '1')"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/g/@g)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:integer", resource.getContent()); + } + } - result = service.query("util:index-type(/test//@h)"); - assertEquals("xs:string", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test//@h, '1')")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("util:index-key-occurrences(/test/h/@h, '1')"); - assertEquals(1, result.getSize()); - assertEquals("1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test//@h)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:string", resource.getContent()); + } + } - result = service.query("util:index-type(/test/h/@h)"); - assertEquals("xs:string", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-key-occurrences(/test/h/@h, '1')")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent()); + } + } - result = service.query("/test//@c[(# exist:force-index-use #) { . = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("util:index-type(/test/h/@h)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("xs:string", resource.getContent()); + } + } - result = service.query("/test[(# exist:force-index-use #) { .//@c = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test//@c[(# exist:force-index-use #) { . = xs:dateTime('2002-12-07T12:20:46.275+01:00') }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test/c/@c[(# exist:force-index-use #) { . = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { .//@c = xs:dateTime('2002-12-07T12:20:46.275+01:00') }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { ./c/@c = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/c/@c[(# exist:force-index-use #) { . = xs:dateTime('2002-12-07T12:20:46.275+01:00') }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test//@d[(# exist:force-index-use #) { . = xs:double(1) }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { ./c/@c = xs:dateTime('2002-12-07T12:20:46.275+01:00') }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { .//@d = xs:double(1) }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test//@d[(# exist:force-index-use #) { . = xs:double(1) }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test/d/@d[(# exist:force-index-use #) { . = xs:double(1) }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { .//@d = xs:double(1) }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { ./d/@d = xs:double(1) }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/d/@d[(# exist:force-index-use #) { . = xs:double(1) }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test//@e[(# exist:force-index-use #) { . = xs:float(1) }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { ./d/@d = xs:double(1) }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { .//@e = xs:float(1) }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test//@e[(# exist:force-index-use #) { . = xs:float(1) }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test/e/@e[(# exist:force-index-use #) { . = xs:float(1) }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { .//@e = xs:float(1) }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { ./e/@e = xs:float(1) }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/e/@e[(# exist:force-index-use #) { . = xs:float(1) }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test//@f[(# exist:force-index-use #) { . = true() }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { ./e/@e = xs:float(1) }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { .//@f = true() }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test//@f[(# exist:force-index-use #) { . = true() }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test/f/@f[(# exist:force-index-use #) { . = true() }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { .//@f = true() }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { ./f/@f = true() }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/f/@f[(# exist:force-index-use #) { . = true() }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test//@g[(# exist:force-index-use #) { . = 1 }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { ./f/@f = true() }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { .//@g = 1 }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test//@g[(# exist:force-index-use #) { . = 1 }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test/g/@g[(# exist:force-index-use #) { . = 1 }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { .//@g = 1 }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { ./g/@g = 1 }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/g/@g[(# exist:force-index-use #) { . = 1 }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test//@h[(# exist:force-index-use #) { . = '1' }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { ./g/@g = 1 }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { .//@h = '1' }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test//@h[(# exist:force-index-use #) { . = '1' }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test/h/@h[(# exist:force-index-use #) { . = '1' }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { .//@h = '1' }]")) { + assertEquals(1, result.getSize()); + } - result = service.query("/test[(# exist:force-index-use #) { ./h/@h = '1' }]"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/h/@h[(# exist:force-index-use #) { . = '1' }]")) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test[(# exist:force-index-use #) { ./h/@h = '1' }]")) { + assertEquals(1, result.getSize()); + } + } } @Test public void missingRangeIndexes() throws Exception { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - @SuppressWarnings("unused") - ResourceSet result; - boolean exceptionThrown = false; - //Configure collection automatically - @SuppressWarnings("unused") - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - - //... then index document - XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class ); - doc.setContent(DOCUMENT_CONTENT2); - testCollection.storeResource(doc); - - XPathQueryService service = testCollection.getService(XPathQueryService.class); - - try { - exceptionThrown = false; - result = service.query("/test/c[(# exist:force-index-use #) { . = xs:dateTime(\"2002-12-07T12:20:46.275+01:00\") }]"); - } catch (Exception e) { - //e.printStackTrace(); - if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) - exceptionThrown = true; - else throw e; - } - assertTrue("Exception expected : missing index", exceptionThrown); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + + //... then index document + try (final XMLResource doc = testCollection.createResource(TestConstants.TEST_XML_URI.toString(), XMLResource.class)) { + doc.setContent(DOCUMENT_CONTENT2); + testCollection.storeResource(doc); + } + + final XPathQueryService service = testCollection.getService(XPathQueryService.class); - try { - exceptionThrown = false; - result = service.query("/test/d[(# exist:force-index-use #) { . = xs:double(1) }]"); - } catch (Exception e) { - if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) - exceptionThrown = true; - else throw e; + boolean exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/c[(# exist:force-index-use #) { . = xs:dateTime('2002-12-07T12:20:46.275+01:00') }]")) { + // required to ensure that result is closed + } catch (final Exception e) { + if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) { + exceptionThrown = true; + } else { + throw e; + } } assertTrue("Exception expected : missing index", exceptionThrown); - try { - exceptionThrown = false; - result = service.query("/test/e[(# exist:force-index-use #) { . = xs:float(1) }]"); - } catch (Exception e) { - if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) - exceptionThrown = true; - else throw e; - } - assertTrue("Exception expected : missing index", exceptionThrown); - - try { - exceptionThrown = false; - result = service.query("/test/f[(# exist:force-index-use #) { . = true() }]"); - } catch (Exception e) { - if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) - exceptionThrown = true; - else throw e; - } - assertTrue("Exception expected : missing index", exceptionThrown); - - try { - exceptionThrown = false; - result = service.query("/test/g[(# exist:force-index-use #) { . = 1 }]"); - } catch (Exception e) { - if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) - exceptionThrown = true; - else throw e; - } - assertTrue("Exception expected : missing index", exceptionThrown); - - try { - exceptionThrown = false; - result = service.query("/test/h[(# exist:force-index-use #) { . = '1' }]"); - } catch (Exception e) { - if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) - exceptionThrown = true; - else throw e; + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/d[(# exist:force-index-use #) { . = xs:double(1) }]")) { + // required to ensure that result is closed + } catch (final Exception e) { + if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) { + exceptionThrown = true; + } else { + throw e; + } } assertTrue("Exception expected : missing index", exceptionThrown); + + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/e[(# exist:force-index-use #) { . = xs:float(1) }]")) { + // required to ensure that result is closed + } catch (final Exception e) { + if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) { + exceptionThrown = true; + } else { + throw e; + } + } + assertTrue("Exception expected : missing index", exceptionThrown); + + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/f[(# exist:force-index-use #) { . = true() }]")) { + // required to ensure that result is closed + } catch (final Exception e) { + if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) { + exceptionThrown = true; + } else { + throw e; + } + } + assertTrue("Exception expected : missing index", exceptionThrown); + + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/g[(# exist:force-index-use #) { . = 1 }]")) { + // required to ensure that result is closed + } catch (final Exception e) { + if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) { + exceptionThrown = true; + } else { + throw e; + } + } + assertTrue("Exception expected : missing index", exceptionThrown); + + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query("/test/h[(# exist:force-index-use #) { . = '1' }]")) { + // required to ensure that result is closed + } catch (final Exception e) { + if (e.getMessage().indexOf("XQDYxxxx") != Constants.STRING_NOT_FOUND) { + exceptionThrown = true; + } else { + throw e; + } + } + assertTrue("Exception expected : missing index", exceptionThrown); + } } @Test @@ -1376,38 +1793,38 @@ public void multipleConfigurations15() { checkStoreConf(CONF_COLL_URI2, TEST_CONFIG_NAME_2, CONF_COLL_URI2, TEST_CONFIG_NAME_2, true); } - private void checkStoreConf(XmldbURI coll1, XmldbURI confName1, XmldbURI coll2, XmldbURI confName2, boolean shouldSucceed) { + private void checkStoreConf(final XmldbURI coll1, final XmldbURI confName1, final XmldbURI coll2, final XmldbURI confName2, final boolean shouldSucceed) { try { storeConfiguration(coll1, confName1, CONFIG1); storeConfiguration(coll2, confName2, CONFIG1); - if(!shouldSucceed) { + if (!shouldSucceed) { fail("Should not have been able to store '" + confName1 + "' to '" + coll1 + "'\n\tand then '" + confName2 + "' to '" + coll2 + "'"); } - } catch (XMLDBException xe) { - if(shouldSucceed) { + } catch (final XMLDBException xe) { + if (shouldSucceed) { fail("Should have been able to store '" + confName1 + "' to '" + coll1 + "'\n\tand then '" + confName2 + "' to '" + coll2 + "': " + xe.getMessage()); } } } - private void storeConfiguration(XmldbURI collPath, XmldbURI confName, String confContent) throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - String fullCollPath = XmldbURI.LOCAL_DB + collPath.toString(); - Collection configColl = DatabaseManager.getCollection(fullCollPath, "admin", ""); - if(configColl == null) { - CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); - configColl = cms.createCollection(collPath.toString()); - UserManagementService ums = configColl.getService(UserManagementService.class); - ums.chmod("rwxr-xr-x"); + + private void storeConfiguration(final XmldbURI collPath, final XmldbURI confName, final String confContent) throws XMLDBException { + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + final CollectionManagementService cms = testCollection.getService(CollectionManagementService.class); + try (final Collection configColl = cms.createCollection(collPath.toString())) { + UserManagementService ums = configColl.getService(UserManagementService.class); + ums.chmod("rwxr-xr-x"); + + try (final Resource res = configColl.createResource(confName.toString(), XMLResource.class)) { + assertNotNull(res); + res.setContent(confContent); + configColl.storeResource(res); + ums = configColl.getService(UserManagementService.class); + ums.chmod(res, 0744); + } + } } - assertNotNull(configColl); - Resource res = configColl.createResource(confName.toString(), XMLResource.class); - assertNotNull(res); - res.setContent(confContent); - configColl.storeResource(res); - UserManagementService ums = configColl.getService(UserManagementService.class); - ums.chmod(res, 0744); } } diff --git a/exist-core/src/test/java/org/exist/xmldb/CollectionTest.java b/exist-core/src/test/java/org/exist/xmldb/CollectionTest.java index d5517066c0..8f476b7c9a 100644 --- a/exist-core/src/test/java/org/exist/xmldb/CollectionTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/CollectionTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -40,7 +64,7 @@ public class CollectionTest { @Before public void setup() throws XMLDBException { final CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - service.createCollection(TestConstants.SPECIAL_NAME); + try (final Collection created = service.createCollection(TestConstants.SPECIAL_NAME)) { } } @After @@ -51,7 +75,8 @@ public void cleanup() throws XMLDBException { @Test public void testRead() throws XMLDBException { - final Collection test = existEmbeddedServer.getRoot().getChildCollection(TestConstants.SPECIAL_NAME); - assertNotNull(test); + try (final Collection test = existEmbeddedServer.getRoot().getChildCollection(TestConstants.SPECIAL_NAME)) { + assertNotNull(test); + } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/ContentAsDOMTest.java b/exist-core/src/test/java/org/exist/xmldb/ContentAsDOMTest.java index 1699900326..41894faa33 100644 --- a/exist-core/src/test/java/org/exist/xmldb/ContentAsDOMTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/ContentAsDOMTest.java @@ -67,7 +67,6 @@ import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XQueryService; @@ -100,46 +99,50 @@ public class ContentAsDOMTest { @Test public void getContentAsDOM() throws XMLDBException, TransformerException, IOException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - XQueryService service = testCollection.getService(XQueryService.class); - ResourceSet result = service.query(XQUERY); - for(long i = 0; i < result.getSize(); i++) { - XMLResource r = (XMLResource) result.getResource(i); - - Node node = r.getContentAsDOM(); - Transformer t = TransformerFactory.newInstance().newTransformer(); - t.setOutputProperty(OutputKeys.INDENT, "yes"); - t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); - DOMSource source = new DOMSource(node); - try (final StringBuilderWriter writer = new StringBuilderWriter()) { - StreamResult output = new StreamResult(writer); - t.transform(source, output); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + final XQueryService service = testCollection.getService(XQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(XQUERY)) { + for (long i = 0; i < result.getSize(); i++) { + try (final XMLResource r = (XMLResource) result.getResource(i)) { + final Node node = r.getContentAsDOM(); + final Transformer t = TransformerFactory.newInstance().newTransformer(); + t.setOutputProperty(OutputKeys.INDENT, "yes"); + t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + final DOMSource source = new DOMSource(node); + try (final StringBuilderWriter writer = new StringBuilderWriter()) { + final StreamResult output = new StreamResult(writer); + t.transform(source, output); + } + } + } } } } - @Before public void setUp() throws Exception { CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - Collection testCollection = service.createCollection(TEST_COLLECTION); - UserManagementService ums = testCollection.getService(UserManagementService.class); - // change ownership to guest - Account guest = ums.getAccount(GUEST_DB_USER); - ums.chown(guest, guest.getPrimaryGroup()); - ums.chmod(Permission.DEFAULT_COLLECTION_PERM); - - Resource resource = testCollection.createResource("test.xml", XMLResource.class); - resource.setContent(XML); - testCollection.storeResource(resource); - ums.chown(resource, guest, GUEST_DB_USER); //change resource ownership to guest + try (final Collection testCollection = service.createCollection(TEST_COLLECTION)) { + final UserManagementService ums = testCollection.getService(UserManagementService.class); + // change ownership to guest + final Account guest = ums.getAccount(GUEST_DB_USER); + ums.chown(guest, guest.getPrimaryGroup()); + ums.chmod(Permission.DEFAULT_COLLECTION_PERM); + + try (final Resource resource = testCollection.createResource("test.xml", XMLResource.class)) { + resource.setContent(XML); + testCollection.storeResource(resource); + ums.chown(resource, guest, GUEST_DB_USER); //change resource ownership to guest + } + } } @After public void tearDown() throws XMLDBException { //delete the test collection - Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, ADMIN_DB_USER, ADMIN_DB_PWD); - CollectionManagementService service = root.getService(CollectionManagementService.class); - service.removeCollection(TEST_COLLECTION); + try (final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, ADMIN_DB_USER, ADMIN_DB_PWD)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + service.removeCollection(TEST_COLLECTION); + } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/CopyMoveTest.java b/exist-core/src/test/java/org/exist/xmldb/CopyMoveTest.java index 6ca773b60f..35761f49e2 100644 --- a/exist-core/src/test/java/org/exist/xmldb/CopyMoveTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/CopyMoveTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -33,8 +57,12 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; -import org.xmldb.api.modules.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; +import org.xmldb.api.modules.CollectionManagementService; +import org.xmldb.api.modules.XMLResource; +import org.xmldb.api.modules.XPathQueryService; public class CopyMoveTest { @@ -46,30 +74,37 @@ public class CopyMoveTest { @Test public void copyResourceChangeName() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - XMLResource original = testCollection.createResource("original", XMLResource.class); - original.setContent(""); - testCollection.storeResource(original); - EXistCollectionManagementService cms = testCollection.getService(EXistCollectionManagementService.class); - cms.copyResource("original", "", "duplicate"); - assertEquals(2, testCollection.getResourceCount()); - XMLResource duplicate = (XMLResource) testCollection.getResource("duplicate"); - assertNotNull(duplicate); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + try (final XMLResource original = testCollection.createResource("original", XMLResource.class)) { + original.setContent(""); + testCollection.storeResource(original); + } + final EXistCollectionManagementService cms = testCollection.getService(EXistCollectionManagementService.class); + cms.copyResource("original", "", "duplicate"); + assertEquals(2, testCollection.getResourceCount()); + try (final XMLResource duplicate = (XMLResource) testCollection.getResource("duplicate")) { + assertNotNull(duplicate); + } + } } @Test public void queryCopiedResource() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - XMLResource original = testCollection.createResource("original", XMLResource.class); - original.setContent(""); - testCollection.storeResource(original); - EXistCollectionManagementService cms = testCollection.getService(EXistCollectionManagementService.class); - cms.copyResource("original", "", "duplicate"); - XMLResource duplicate = (XMLResource) testCollection.getResource("duplicate"); - assertNotNull(duplicate); - XPathQueryService xq = testCollection.getService(XPathQueryService.class); - ResourceSet rs = xq.queryResource("duplicate", "/sample"); - assertEquals(1, rs.getSize()); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + try (final XMLResource original = testCollection.createResource("original", XMLResource.class)) { + original.setContent(""); + testCollection.storeResource(original); + } + final EXistCollectionManagementService cms = testCollection.getService(EXistCollectionManagementService.class); + cms.copyResource("original", "", "duplicate"); + try (final XMLResource duplicate = (XMLResource) testCollection.getResource("duplicate")) { + assertNotNull(duplicate); + } + final XPathQueryService xq = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet rs = (EXistResourceSet) xq.queryResource("duplicate", "/sample")) { + assertEquals(1, rs.getSize()); + } + } } @Test @@ -81,55 +116,62 @@ public void changePermissionsAfterCopy() throws XMLDBException { final String resourceURL = collectionURL + "/" + originalResource; //get collection & services - EXistCollection col = (EXistCollection)DatabaseManager.getCollection(collectionURL); - EXistCollectionManagementService service = col.getService(EXistCollectionManagementService.class); - UserManagementService ums = DatabaseManager.getCollection(collectionURL, ADMIN_DB_USER, ADMIN_DB_PWD).getService(UserManagementService.class); - - //store xml document - XMLResource original = col.createResource(originalResource, XMLResource.class); - original.setContent(""); - col.storeResource(original); + try (final EXistCollection col = (EXistCollection)DatabaseManager.getCollection(collectionURL); + final Collection adminCol = DatabaseManager.getCollection(collectionURL, ADMIN_DB_USER, ADMIN_DB_PWD)) { + final EXistCollectionManagementService service = col.getService(EXistCollectionManagementService.class); + final UserManagementService ums = adminCol.getService(UserManagementService.class); - //get original resource - Resource orgnRes = col.getResource(originalResource); + //store xml document + try (final XMLResource original = col.createResource(originalResource, XMLResource.class)) { + original.setContent(""); + col.storeResource(original); + } - //check permission before copy - Permission prm = ums.getPermissions(orgnRes); - assertEquals("rw-r--r--", prm.toString()); - - //copy - service.copyResource(XmldbURI.create(resourceURL), col.getPathURI(), XmldbURI.create(copyResource)); + //get original resource + try (final Resource orgnRes = col.getResource(originalResource)) { - //check permission after copy - prm = ums.getPermissions(orgnRes); - assertEquals("rw-r--r--", prm.toString()); + //check permission before copy + Permission prm = ums.getPermissions(orgnRes); + assertEquals("rw-r--r--", prm.toString()); - //get copy resource - Resource copyRes = col.getResource(copyResource); - - //change permission on copy - Account admin = ums.getAccount(ADMIN_DB_USER); - ums.chown(copyRes, admin, admin.getPrimaryGroup()); - ums.chmod(copyRes, "rwx--x---"); - - //check permission of copy - prm = ums.getPermissions(copyRes); - assertEquals("rwx--x---", prm.toString()); - //check permission of original - prm = ums.getPermissions(orgnRes); - assertEquals("rw-r--r--", prm.toString()); + //copy + service.copyResource(XmldbURI.create(resourceURL), col.getPathURI(), XmldbURI.create(copyResource)); + + //check permission after copy + prm = ums.getPermissions(orgnRes); + assertEquals("rw-r--r--", prm.toString()); + + //get copy resource + try (final Resource copyRes = col.getResource(copyResource)) { + + //change permission on copy + final Account admin = ums.getAccount(ADMIN_DB_USER); + ums.chown(copyRes, admin, admin.getPrimaryGroup()); + ums.chmod(copyRes, "rwx--x---"); + + //check permission of copy + prm = ums.getPermissions(copyRes); + assertEquals("rwx--x---", prm.toString()); + } + + //check permission of original + prm = ums.getPermissions(orgnRes); + assertEquals("rw-r--r--", prm.toString()); + } + } } @Before public void setUp() throws Exception { final CollectionManagementService cms = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - final Collection testCollection = cms.createCollection(TEST_COLLECTION); - final UserManagementService ums = testCollection.getService(UserManagementService.class); - // change ownership to guest - final Account guest = ums.getAccount(GUEST_DB_USER); - ums.chown(guest, guest.getPrimaryGroup()); - ums.chmod("rwxr-xr-x"); + try (final Collection testCollection = cms.createCollection(TEST_COLLECTION)) { + final UserManagementService ums = testCollection.getService(UserManagementService.class); + // change ownership to guest + final Account guest = ums.getAccount(GUEST_DB_USER); + ums.chown(guest, guest.getPrimaryGroup()); + ums.chmod("rwxr-xr-x"); + } } @After diff --git a/exist-core/src/test/java/org/exist/xmldb/CreateCollectionsTest.java b/exist-core/src/test/java/org/exist/xmldb/CreateCollectionsTest.java index fef617812c..302b78516a 100644 --- a/exist-core/src/test/java/org/exist/xmldb/CreateCollectionsTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/CreateCollectionsTest.java @@ -88,12 +88,13 @@ public class CreateCollectionsTest { public void setUp() throws XMLDBException { //create a test collection final CollectionManagementService cms = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - final Collection test = cms.createCollection(TEST_COLLECTION); - final UserManagementService ums = test.getService(UserManagementService.class); - // change ownership to guest - Account guest = ums.getAccount(GUEST_DB_USER); - ums.chown(guest, guest.getPrimaryGroup()); - ums.chmod("rwxrwxrwx"); + try (final Collection test = cms.createCollection(TEST_COLLECTION)) { + final UserManagementService ums = test.getService(UserManagementService.class); + // change ownership to guest + Account guest = ums.getAccount(GUEST_DB_USER); + ums.chown(guest, guest.getPrimaryGroup()); + ums.chmod("rwxrwxrwx"); + } } @After @@ -105,112 +106,129 @@ public void tearDown() throws XMLDBException { @Test public void rootCollectionHasNoParent() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, ADMIN_DB_USER, ADMIN_DB_PWD); - assertNull("root collection has no parent", root.getParentCollection()); + try (final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, ADMIN_DB_USER, ADMIN_DB_PWD)) { + assertNull("root collection has no parent", root.getParentCollection()); + } } @Test public void collectionMustProvideAtLeastOneService() throws XMLDBException { - final Collection colTest = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - final List> expectedServiceTypes = Arrays.asList(CollectionManagementService.class, - DatabaseInstanceManager.class, EXistCollectionManagementService.class, EXistRestoreService.class, - EXistUserManagementService.class, IndexQueryService.class, UserManagementService.class, - XPathQueryService.class, XQueryService.class, XUpdateQueryService.class); - for (Class expectedServiceType : expectedServiceTypes) { - assertTrue(colTest.hasService(expectedServiceType)); - assertNotNull(colTest.getService(expectedServiceType)); + try (final Collection colTest = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + final List> expectedServiceTypes = Arrays.asList(CollectionManagementService.class, + DatabaseInstanceManager.class, EXistCollectionManagementService.class, EXistRestoreService.class, + EXistUserManagementService.class, IndexQueryService.class, UserManagementService.class, + XPathQueryService.class, XQueryService.class, XUpdateQueryService.class); + for (Class expectedServiceType : expectedServiceTypes) { + assertTrue(colTest.hasService(expectedServiceType)); + assertNotNull(colTest.getService(expectedServiceType)); + } } } @Test public void createCollection_hasNoSubCollections_andIsOpen() throws XMLDBException { - final Collection colTest = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - final CollectionManagementService service = colTest.getService(CollectionManagementService.class); - final Collection testCollection = service.createCollection("test"); - assertNotNull(testCollection); - - assertEquals("Created Collection has zero child collections", 0, testCollection.getChildCollectionCount()); - assertTrue("Created Collection state should be Open after creation", testCollection.isOpen()); + try (final Collection colTest = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + final CollectionManagementService service = colTest.getService(CollectionManagementService.class); + try (final Collection testCollection = service.createCollection("test")) { + assertNotNull(testCollection); + + assertEquals("Created Collection has zero child collections", 0, testCollection.getChildCollectionCount()); + assertTrue("Created Collection state should be Open after creation", testCollection.isOpen()); + } + } } @Test public void storeSamplesShakespeare() throws XMLDBException, IOException, URISyntaxException { - final Collection colTest = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - final CollectionManagementService service = colTest.getService(CollectionManagementService.class); - final Collection testCollection = service.createCollection("test"); - UserManagementService ums = testCollection.getService(UserManagementService.class); - ums.chmod("rwxr-xr-x"); - - final List storedResourceNames = new ArrayList<>(); - final List filenames = new ArrayList<>(); - - //store the samples - for (final String sampleName : SAMPLES.getShakespeareXmlSampleNames()) { - final Resource res = storeResourceFromFile(SAMPLES.getShakespeareSample(sampleName), testCollection, sampleName); - storedResourceNames.add(res.getId()); - filenames.add(sampleName); + try (final Collection colTest = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + final CollectionManagementService service = colTest.getService(CollectionManagementService.class); + try (final Collection testCollection = service.createCollection("test")) { + UserManagementService ums = testCollection.getService(UserManagementService.class); + ums.chmod("rwxr-xr-x"); + + final List storedResourceNames = new ArrayList<>(); + final List filenames = new ArrayList<>(); + + //store the samples + for (final String sampleName : SAMPLES.getShakespeareXmlSampleNames()) { + try (final Resource res = storeResourceFromFile(SAMPLES.getShakespeareSample(sampleName), testCollection, sampleName)) { + storedResourceNames.add(res.getId()); + filenames.add(sampleName); + } + } + + assertEquals(filenames, storedResourceNames); + + //get a list from the database of stored resource names + final List retrievedStoredResourceNames = testCollection.listResources(); + + //order of names from database may not be the order in which the files were loaded! + Collections.sort(filenames); + Collections.sort(retrievedStoredResourceNames); + + assertEquals(filenames, retrievedStoredResourceNames); + } } - - assertEquals(filenames, storedResourceNames); - - //get a list from the database of stored resource names - final List retrievedStoredResourceNames = testCollection.listResources(); - - //order of names from database may not be the order in which the files were loaded! - Collections.sort(filenames); - Collections.sort(retrievedStoredResourceNames); - - assertEquals(filenames, retrievedStoredResourceNames); } @Test public void storeRemoveStoreResource() throws XMLDBException, IOException, URISyntaxException { - final Collection colTest = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - final CollectionManagementService service = colTest.getService(CollectionManagementService.class); - final Collection testCollection = service.createCollection("test"); - UserManagementService ums = testCollection.getService(UserManagementService.class); - ums.chmod("rwxr-xr-x"); - - final String testFile = "macbeth.xml"; - try (final InputStream is = SAMPLES.getMacbethSample()) { - storeResourceFromFile(is, testCollection, testFile); + try (final Collection colTest = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + final CollectionManagementService service = colTest.getService(CollectionManagementService.class); + try (final Collection testCollection = service.createCollection("test")) { + UserManagementService ums = testCollection.getService(UserManagementService.class); + ums.chmod("rwxr-xr-x"); + + final String testFile = "macbeth.xml"; + try (final InputStream is = SAMPLES.getMacbethSample(); + final XMLResource storedFromFile = storeResourceFromFile(is, testCollection, testFile)) { + } + final int resourceCount; + try (final Resource resMacbeth = testCollection.getResource(testFile)) { + assertNotNull("getResource(" + testFile + "\")", resMacbeth); + + resourceCount = testCollection.getResourceCount(); + + testCollection.removeResource(resMacbeth); + } + assertEquals("After removal resource count must decrease", resourceCount - 1, testCollection.getResourceCount()); + try (final Resource resMacbethAfterRemove = testCollection.getResource(testFile)) { + assertNull(resMacbethAfterRemove); + } + + // restore the resource just removed + try (final InputStream is = SAMPLES.getMacbethSample(); + final XMLResource restoredFromFile = storeResourceFromFile(is, testCollection, testFile)) { + } + assertEquals("After re-store resource count must increase", resourceCount, testCollection.getResourceCount()); + try (final Resource resMacbethAfterRestore = testCollection.getResource(testFile)) { + assertNotNull("getResource(" + testFile + "\")", resMacbethAfterRestore); + } + } } - Resource resMacbeth = testCollection.getResource(testFile); - assertNotNull("getResource(" + testFile + "\")", resMacbeth); - - final int resourceCount = testCollection.getResourceCount(); - - testCollection.removeResource(resMacbeth); - assertEquals("After removal resource count must decrease", resourceCount - 1, testCollection.getResourceCount()); - resMacbeth = testCollection.getResource(testFile); - assertNull(resMacbeth); - - // restore the resource just removed - try (final InputStream is = SAMPLES.getMacbethSample()) { - storeResourceFromFile(is, testCollection, testFile); - } - assertEquals("After re-store resource count must increase", resourceCount, testCollection.getResourceCount()); - resMacbeth = testCollection.getResource(testFile); - assertNotNull("getResource(" + testFile + "\")", resMacbeth); } @Test public void storeBinaryResource() throws XMLDBException, IOException, URISyntaxException { - Collection colTest = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - CollectionManagementService service = colTest.getService(CollectionManagementService.class); - Collection testCollection = service.createCollection("test"); - UserManagementService ums = testCollection.getService(UserManagementService.class); - ums.chmod("rwxr-xr-x"); - - final Path fLogo = Paths.get(getClass().getClassLoader().getResource("org/exist/xquery/value/logo.png").toURI()); - byte[] data = storeBinaryResourceFromFile(fLogo, testCollection); - Object content = testCollection.getResource("logo.png").getContent(); - byte[] dataStored = (byte[])content; - assertArrayEquals("After storing binary resource, data out==data in", data, dataStored); + try (Collection colTest = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + CollectionManagementService service = colTest.getService(CollectionManagementService.class); + try (Collection testCollection = service.createCollection("test")) { + UserManagementService ums = testCollection.getService(UserManagementService.class); + ums.chmod("rwxr-xr-x"); + + final Path fLogo = Paths.get(getClass().getClassLoader().getResource("org/exist/xquery/value/logo.png").toURI()); + byte[] data = storeBinaryResourceFromFile(fLogo, testCollection); + try (final Resource storedLogo = testCollection.getResource("logo.png")) { + Object content = storedLogo.getContent(); + byte[] dataStored = (byte[])content; + assertArrayEquals("After storing binary resource, data out==data in", data, dataStored); + } + } + } } private XMLResource storeResourceFromFile(final InputStream is, final Collection testCollection, final String fileName) throws XMLDBException, IOException { - XMLResource res = testCollection.createResource(fileName, XMLResource.class); + final XMLResource res = testCollection.createResource(fileName, XMLResource.class); assertNotNull("storeResourceFromFile", res); res.setContent(InputStreamUtil.readString(is, UTF_8)); testCollection.storeResource(res); @@ -218,39 +236,44 @@ private XMLResource storeResourceFromFile(final InputStream is, final Collection } private byte[] storeBinaryResourceFromFile(Path file, Collection testCollection) throws XMLDBException, IOException { - final Resource res = testCollection.createResource(file.getFileName().toString(), BinaryResource.class); - assertNotNull("store binary Resource From File", res); - // Get an array of bytes from the file: - final byte[] data = Files.readAllBytes(file); - res.setContent(data); - testCollection.storeResource(res); - return data; + try (final Resource res = testCollection.createResource(file.getFileName().toString(), BinaryResource.class)) { + assertNotNull("store binary Resource From File", res); + // Get an array of bytes from the file: + final byte[] data = Files.readAllBytes(file); + res.setContent(data); + testCollection.storeResource(res); + return data; + } } @Test public void testMultipleCreates() throws XMLDBException { - - Collection testCol = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - CollectionManagementService cms = testCol.getService(CollectionManagementService.class); - assertNotNull(cms); - - cms.createCollection("dummy1"); - Collection c1 = testCol.getChildCollection("dummy1"); - assertNotNull(c1); - - cms.setCollection(c1); - cms.createCollection("dummy2"); - Collection c2 = c1.getChildCollection("dummy2"); - assertNotNull(c2); - - cms.setCollection(c2); - cms.createCollection("dummy3"); - Collection c3 = c2.getChildCollection("dummy3"); - assertNotNull(c3); - - cms.setCollection(testCol); - cms.removeCollection("dummy1"); - c1 = testCol.getChildCollection("dummy1"); - assertNull(c1); + + try (final Collection testCol = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + CollectionManagementService cms = testCol.getService(CollectionManagementService.class); + assertNotNull(cms); + + try (final Collection dummy1Created = cms.createCollection("dummy1"); + final Collection c1 = testCol.getChildCollection("dummy1")) { + assertNotNull(c1); + + cms.setCollection(c1); + try (final Collection dummy2Created = cms.createCollection("dummy2"); + final Collection c2 = c1.getChildCollection("dummy2")) { + assertNotNull(c2); + + cms.setCollection(c2); + try (final Collection dummy3Created = cms.createCollection("dummy3"); + final Collection c3 = c2.getChildCollection("dummy3")) { + assertNotNull(c3); + } + } + } + + cms.setCollection(testCol); + cms.removeCollection("dummy1"); + final Collection c1AfterRemove = testCol.getChildCollection("dummy1"); + assertNull(c1AfterRemove); + } } } \ No newline at end of file diff --git a/exist-core/src/test/java/org/exist/xmldb/DOMTest.java b/exist-core/src/test/java/org/exist/xmldb/DOMTest.java index 649c70cfc8..3e4ebb792e 100644 --- a/exist-core/src/test/java/org/exist/xmldb/DOMTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/DOMTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -46,12 +70,16 @@ import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.ResourceIterator; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XPathQueryService; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; /** * @author jmv @@ -73,34 +101,32 @@ public class DOMTest { */ @Test public void test1() throws XMLDBException { + final CollectionManagementService cms = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); + try (final Collection created = cms.createCollection("A")) { } // jmv + cms.removeCollection("A"); + try (final Collection created = cms.createCollection("A")) { } + try (final Collection coll = existEmbeddedServer.getRoot().getChildCollection("A")) { - CollectionManagementService cms = - existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - cms.createCollection("A"); // jmv - cms.removeCollection("A"); - cms.createCollection("A"); - Collection coll = existEmbeddedServer.getRoot().getChildCollection("A"); - - XMLResource r = - coll.createResource( - name, - XMLResource.class); - r.setContent( - "Table"); - coll.storeResource(r); - - XPathQueryService xpqs = coll.getService(XPathQueryService.class); - ResourceSet rs = - xpqs.query( - "//properties[property[@key='type' and text()='Table']]"); - for (ResourceIterator i = rs.getIterator(); - i.hasMoreResources(); - ) { - r = (XMLResource) i.nextResource(); - String s = (String) r.getContent(); - Node content = r.getContentAsDOM(); - coll.removeResource(r); + try (final XMLResource r = coll.createResource(name, XMLResource.class)) { + r.setContent("Table"); + coll.storeResource(r); + } + + final XPathQueryService xpqs = coll.getService(XPathQueryService.class); + try (final EXistResourceSet rs = (EXistResourceSet) xpqs.query("//properties[property[@key='type' and text()='Table']]")) { + for (final ResourceIterator i = rs.getIterator(); i.hasMoreResources(); ) { + try (final XMLResource r = (XMLResource) i.nextResource()) { + final String s = (String) r.getContent(); + assertNotNull(s); + final Node content = r.getContentAsDOM(); + assertNotNull(content); + assertTrue(content instanceof Element); + + coll.removeResource(r); + } + } + } } cms.removeCollection("A"); @@ -112,68 +138,63 @@ public void test1() throws XMLDBException { * */ @Test public void test2() throws XMLDBException, InstantiationException, IllegalAccessException, ClassNotFoundException, ParserConfigurationException, IOException { - for (int i = 0; i < 2; i++) { - XMLResource resource = (XMLResource) existEmbeddedServer.getRoot().getResource(name); - if (resource == null) { - resource = - existEmbeddedServer.getRoot().createResource( - name, - XMLResource.class); - - DocumentBuilderFactory dbf = - DocumentBuilderFactory.newInstance(); - DocumentBuilder db = dbf.newDocumentBuilder(); - Document doc = db.newDocument(); - Element rootElem = doc.createElement("element"); - doc.appendChild(rootElem); - - resource.setContentAsDOM(doc); - existEmbeddedServer.getRoot().storeResource(resource); - - resource = (XMLResource) existEmbeddedServer.getRoot().getResource(name); - } - String s = (String) resource.getContent(); - Node content = resource.getContentAsDOM(); + try (final XMLResource resource = existEmbeddedServer.getRoot().createResource(name, XMLResource.class)) { + final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + final DocumentBuilder db = dbf.newDocumentBuilder(); + final Document doc = db.newDocument(); + final Element rootElem = doc.createElement("element"); + doc.appendChild(rootElem); + resource.setContentAsDOM(doc); + existEmbeddedServer.getRoot().storeResource(resource); + } + + try (final XMLResource resource = (XMLResource) existEmbeddedServer.getRoot().getResource(name)) { + final String s = (String) resource.getContent(); + assertNotNull(s); + final Node content = resource.getContentAsDOM(); + assertNotNull(content); + assertTrue(content instanceof Document); } existEmbeddedServer.restart(); - XMLResource resource = (XMLResource) existEmbeddedServer.getRoot().getResource(name); - existEmbeddedServer.getRoot().removeResource(resource); + try (final XMLResource resource = (XMLResource) existEmbeddedServer.getRoot().getResource(name)) { + existEmbeddedServer.getRoot().removeResource(resource); + } } /** like test 2 but add attribute and text as well */ @Test public void test3() throws XMLDBException, ParserConfigurationException { - Collection coll = existEmbeddedServer.getRoot(); - XMLResource resource = - coll.createResource( - name, - XMLResource.class); - - Document doc = - DocumentBuilderFactory - .newInstance() - .newDocumentBuilder() - .newDocument(); - Element rootElem = doc.createElement("element"); - Element propertyElem = doc.createElement("property"); - propertyElem.setAttribute("key", "value"); - propertyElem.appendChild(doc.createTextNode("text")); - rootElem.appendChild(propertyElem); - doc.appendChild(rootElem); - resource.setContentAsDOM(doc); - - coll.storeResource(resource); - coll.close(); - - coll = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", ""); - resource = (XMLResource) coll.getResource(name); - String s = (String) resource.getContent(); - Node n = resource.getContentAsDOM(); - - coll.removeResource(resource); + final Collection coll = existEmbeddedServer.getRoot(); + try (final XMLResource resource = coll.createResource(name, XMLResource.class)) { + final Document doc = + DocumentBuilderFactory + .newInstance() + .newDocumentBuilder() + .newDocument(); + final Element rootElem = doc.createElement("element"); + final Element propertyElem = doc.createElement("property"); + propertyElem.setAttribute("key", "value"); + propertyElem.appendChild(doc.createTextNode("text")); + rootElem.appendChild(propertyElem); + doc.appendChild(rootElem); + resource.setContentAsDOM(doc); + + coll.storeResource(resource); + } + + try (final Collection coll2 = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", "")) { + final XMLResource resource = (XMLResource) coll2.getResource(name); + final String s = (String) resource.getContent(); + assertNotNull(s); + final Node content = resource.getContentAsDOM(); + assertNotNull(content); + assertTrue(content instanceof Document); + + coll2.removeResource(resource); + } } /** like test 3 but uses the DOM as input to an (identity) XSLT transform */ @@ -188,65 +209,67 @@ public void test4_getContentAsDOM() throws XMLDBException, ParserConfigurationEx } private void _test4(boolean getContentAsDOM) throws TransformerException, ParserConfigurationException, XMLDBException, IOException, SAXException { - Collection coll = existEmbeddedServer.getRoot(); - XMLResource resource = - coll.createResource( - name, - XMLResource.class); - - Document doc = - DocumentBuilderFactory - .newInstance() - .newDocumentBuilder() - .newDocument(); - Element rootElem = doc.createElement("element"); - Element propertyElem = doc.createElement("property"); - propertyElem.setAttribute("key", "value"); - propertyElem.appendChild(doc.createTextNode("text")); - rootElem.appendChild(propertyElem); - doc.appendChild(rootElem); - resource.setContentAsDOM(doc); - - coll.storeResource(resource); - coll.close(); - - coll = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", ""); - resource = (XMLResource) coll.getResource(name); - - Node n; - if (getContentAsDOM) { - n = resource.getContentAsDOM(); - } else { - String s = (String) resource.getContent(); - byte[] bytes; - bytes = s.getBytes(UTF_8); - try(final UnsynchronizedByteArrayInputStream bais = new UnsynchronizedByteArrayInputStream(bytes)) { - DocumentBuilder db = - DocumentBuilderFactory.newInstance().newDocumentBuilder(); - n = db.parse(bais); - } + final Collection coll = existEmbeddedServer.getRoot(); + try (final XMLResource resource = coll.createResource(name, XMLResource.class)) { + + final Document doc = + DocumentBuilderFactory + .newInstance() + .newDocumentBuilder() + .newDocument(); + final Element rootElem = doc.createElement("element"); + final Element propertyElem = doc.createElement("property"); + propertyElem.setAttribute("key", "value"); + propertyElem.appendChild(doc.createTextNode("text")); + rootElem.appendChild(propertyElem); + doc.appendChild(rootElem); + resource.setContentAsDOM(doc); + + coll.storeResource(resource); } - Transformer t = TransformerFactory.newInstance().newTransformer(); - DOMSource source = new DOMSource(n); - SAXResult result = new SAXResult(new DOMTest.SAXHandler()); - t.transform(source, result); - - coll.removeResource(resource); + try (final Collection coll2 = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", "")) { + try (final XMLResource resource = (XMLResource) coll2.getResource(name)) { + + final Node n; + if (getContentAsDOM) { + n = resource.getContentAsDOM(); + } else { + final String s = (String) resource.getContent(); + final byte[] bytes = s.getBytes(UTF_8); + try (final UnsynchronizedByteArrayInputStream bais = new UnsynchronizedByteArrayInputStream(bytes)) { + final DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + n = db.parse(bais); + } + } + assertNotNull(n); + assertTrue(n instanceof Document); + + final Transformer t = TransformerFactory.newInstance().newTransformer(); + final DOMSource source = new DOMSource(n); + final SAXResult result = new SAXResult(new DOMTest.SAXHandler()); + t.transform(source, result); + + coll2.removeResource(resource); + } + } } public static class SAXHandler implements ContentHandler { SAXHandler() { } + @Override public void characters(char[] ch, int start, int length) { LOG.trace("SAXHandler.characters({}, {}, {})", new String(ch), start, length); } + @Override public void endDocument() { LOG.trace("SAXHandler.endDocument()"); } + @Override public void endElement( String namespaceURI, String localName, @@ -254,30 +277,37 @@ public void endElement( LOG.trace("SAXHandler.endElement({}, {}, {})", namespaceURI, localName, qName); } + @Override public void endPrefixMapping(String prefix) { LOG.trace("SAXHandler.endPrefixMapping({})", prefix); } + @Override public void ignorableWhitespace(char[] ch, int start, int length) { LOG.trace("SAXHandler.ignorableWhitespace({}, {}, {})", new String(ch), start, length); } + @Override public void processingInstruction(String target, String data) { LOG.trace("SAXHandler.processingInstruction({}, {})", target, data); } + @Override public void setDocumentLocator(Locator locator) { LOG.trace("SAXHandler.setDocumentLocator({})", locator); } + @Override public void skippedEntity(String name) { LOG.trace("SAXHandler.skippedEntity({})", name); } + @Override public void startDocument() { LOG.trace("SAXHandler.startDocument()"); } + @Override public void startElement( String namespaceURI, String localName, @@ -286,6 +316,7 @@ public void startElement( LOG.trace("SAXHandler.startElement({}, {}, {},{})", namespaceURI, localName, qName, atts); } + @Override public void startPrefixMapping(String prefix, String xuri) { LOG.trace("SAXHandler.startPrefixMapping({}, {})", prefix, xuri); } 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 b0e25b0eb7..09eb927658 100644 --- a/exist-core/src/test/java/org/exist/xmldb/DeclareVariableTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/DeclareVariableTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -30,7 +54,10 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.CompiledExpression; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XQueryService; @@ -72,33 +99,42 @@ private final String getBaseUri() { @Before public void setUp() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService service = root.getService(CollectionManagementService.class); - testCollection = service.createCollection(TEST_COLLECTION_NAME); - assertNotNull(testCollection); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + testCollection = service.createCollection(TEST_COLLECTION_NAME); + assertNotNull(testCollection); + } } @After public void tearDown() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService service = root.getService(CollectionManagementService.class); - service.removeCollection(TEST_COLLECTION_NAME); - testCollection = null; + testCollection.close(); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + service.removeCollection(TEST_COLLECTION_NAME); + testCollection = null; + } } @Test public void declareBigInteger() throws XMLDBException { - final Resource result = executeQueryWithExternalVariable(new BigInteger("123456789123456789123456789")); - assertEquals("123456789123456789123456789", result.getContent()); + try (final EXistResourceSet result = executeQueryWithExternalVariable(new BigInteger("123456789123456789123456789"))) { + final Resource resource = result.getResource(0); + assertNotNull(resource); + assertEquals("123456789123456789123456789", resource.getContent()); + } } @Test public void declareBigDecimal() throws XMLDBException { - final Resource result = executeQueryWithExternalVariable(new BigDecimal("1.1")); - assertEquals("1.1", result.getContent()); + try (final EXistResourceSet result = executeQueryWithExternalVariable(new BigDecimal("1.1"))) { + final Resource resource = result.getResource(0); + assertNotNull(resource); + assertEquals("1.1", resource.getContent()); + } } - private Resource executeQueryWithExternalVariable(final Object value) throws XMLDBException { + private EXistResourceSet executeQueryWithExternalVariable(final Object value) throws XMLDBException { final XQueryService xqueryService = testCollection.getService(XQueryService.class); xqueryService.declareVariable("x", value); @@ -108,11 +144,8 @@ private Resource executeQueryWithExternalVariable(final Object value) throws XML "$x"; final CompiledExpression compiled = xqueryService.compile(query); - - final ResourceSet resourceSet = xqueryService.execute(compiled); + final EXistResourceSet resourceSet = (EXistResourceSet) xqueryService.execute(compiled); assertEquals(1, resourceSet.getSize()); - final Resource resource = resourceSet.getResource(0); - assertNotNull(resource); - return resource; + return resourceSet; } } diff --git a/exist-core/src/test/java/org/exist/xmldb/DeleteCollectionTest.java b/exist-core/src/test/java/org/exist/xmldb/DeleteCollectionTest.java index 6d2d0d81df..a76992a945 100644 --- a/exist-core/src/test/java/org/exist/xmldb/DeleteCollectionTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/DeleteCollectionTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -79,34 +103,42 @@ public void delete() throws XMLDBException { * /db/testDelete/00/33 */ EXistCollectionManagementService service = testCollection.getService(EXistCollectionManagementService.class); - final Collection zeroCollection = service.createCollection(ZERO_COLLECTION_NAME); - assertNotNull(zeroCollection); - - final Collection oneCollection = service.createCollection(ONE_COLLECTION_NAME); - assertNotNull(oneCollection); - - service = zeroCollection.getService(EXistCollectionManagementService.class); - final Collection threeCollection = service.createCollection(THREE_COLLECTION_NAME); - assertNotNull(threeCollection); - - // delete the collection /db/test/00 - service = testCollection.getService(EXistCollectionManagementService.class); - service.removeCollection(ZERO_COLLECTION_NAME); + try (final Collection zeroCollection = service.createCollection(ZERO_COLLECTION_NAME)) { + assertNotNull(zeroCollection); + + try (final Collection oneCollection = service.createCollection(ONE_COLLECTION_NAME)) { + assertNotNull(oneCollection); + + service = zeroCollection.getService(EXistCollectionManagementService.class); + try (final Collection threeCollection = service.createCollection(THREE_COLLECTION_NAME)) { + assertNotNull(threeCollection); + + // delete the collection /db/test/00 + service = testCollection.getService(EXistCollectionManagementService.class); + service.removeCollection(ZERO_COLLECTION_NAME); + } + } + } } @Before public void setUp() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService service = root.getService(CollectionManagementService.class); - testCollection = service.createCollection(TEST_COLLECTION_NAME); - assertNotNull(testCollection); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + testCollection = service.createCollection(TEST_COLLECTION_NAME); + assertNotNull(testCollection); + } } @After public void tearDown() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService service = root.getService(CollectionManagementService.class); - service.removeCollection(TEST_COLLECTION_NAME); - testCollection = null; + if (testCollection != null) { + testCollection.close(); + testCollection = null; + } + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + service.removeCollection(TEST_COLLECTION_NAME); + } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/EXistXMLSerializeTest.java b/exist-core/src/test/java/org/exist/xmldb/EXistXMLSerializeTest.java index e08f9a1e2d..957b4a8e38 100644 --- a/exist-core/src/test/java/org/exist/xmldb/EXistXMLSerializeTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/EXistXMLSerializeTest.java @@ -116,12 +116,13 @@ public class EXistXMLSerializeTest { @Before public void setUp() throws Exception { CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - Collection testCollection = service.createCollection(TEST_COLLECTION); - UserManagementService ums = testCollection.getService(UserManagementService.class); - // change ownership to guest - Account guest = ums.getAccount(GUEST_DB_USER); - ums.chown(guest, guest.getPrimaryGroup()); - ums.chmod("rwxr-xr-x"); + try (final Collection testCollection = service.createCollection(TEST_COLLECTION)) { + UserManagementService ums = testCollection.getService(UserManagementService.class); + // change ownership to guest + Account guest = ums.getAccount(GUEST_DB_USER); + ums.chown(guest, guest.getPrimaryGroup()); + ums.chmod("rwxr-xr-x"); + } } @After @@ -133,120 +134,143 @@ public void tearDown() throws XMLDBException { @Test public void serialize1() throws TransformerException, XMLDBException, ParserConfigurationException, SAXException, IOException, URISyntaxException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - XMLResource resource = testCollection.createResource(null, XMLResource.class); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + final String resourceId; + try (final XMLResource resource = testCollection.createResource(null, XMLResource.class)) { - Document doc = javax.xml.parsers.DocumentBuilderFactory.newInstance( ). - newDocumentBuilder().parse(Paths.get(testFile.toURI()).toFile()); + Document doc = javax.xml.parsers.DocumentBuilderFactory.newInstance( ). + newDocumentBuilder().parse(Paths.get(testFile.toURI()).toFile()); - resource.setContentAsDOM(doc); - testCollection.storeResource(resource); + resource.setContentAsDOM(doc); + testCollection.storeResource(resource); + resourceId = resource.getId(); + } - resource = (XMLResource)testCollection.getResource(resource.getId()); - assertNotNull(resource); - Node node = resource.getContentAsDOM( ); - node = node.getOwnerDocument(); + try (final XMLResource resource = (XMLResource)testCollection.getResource(resourceId)) { + assertNotNull(resource); + Node node = resource.getContentAsDOM( ); + node = node.getOwnerDocument(); - //Attempting serialization - DOMSource source = new DOMSource(node); - try (final UnsynchronizedByteArrayOutputStream out = new UnsynchronizedByteArrayOutputStream()) { - StreamResult result = new StreamResult(out); + //Attempting serialization + DOMSource source = new DOMSource(node); + try (final UnsynchronizedByteArrayOutputStream out = new UnsynchronizedByteArrayOutputStream()) { + StreamResult result = new StreamResult(out); - Transformer xformer = TransformerFactory.newInstance().newTransformer(); - xformer.transform(source, result); + Transformer xformer = TransformerFactory.newInstance().newTransformer(); + xformer.transform(source, result); + } + } } } @Test public void serialize2() throws ParserConfigurationException, SAXException, IOException, XMLDBException, URISyntaxException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - Document doc = javax.xml.parsers.DocumentBuilderFactory.newInstance( ).newDocumentBuilder().parse(Paths.get(testFile.toURI()).toFile()); - XMLResource resource = testCollection.createResource(null, XMLResource.class); - resource.setContentAsDOM(doc); - testCollection.storeResource(resource); - - resource = (XMLResource)testCollection.getResource(resource.getId()); - assertNotNull(resource); - Node node = resource.getContentAsDOM(); - - OutputFormat format = new OutputFormat( ); - format.setLineWidth(0); - format.setIndent(5); - format.setPreserveSpace(true); - try (final UnsynchronizedByteArrayOutputStream out = new UnsynchronizedByteArrayOutputStream()) { - XMLSerializer serializer = new XMLSerializer(out, format); - - if (node instanceof Document) { - serializer.serialize((Document) node); - } else if (node instanceof Element) { - serializer.serialize((Element) node); - } else { - fail("Can't serialize node type: " + node); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + Document doc = javax.xml.parsers.DocumentBuilderFactory.newInstance( ).newDocumentBuilder().parse(Paths.get(testFile.toURI()).toFile()); + final String resourceId; + try (final XMLResource resource = testCollection.createResource(null, XMLResource.class)) { + resource.setContentAsDOM(doc); + testCollection.storeResource(resource); + resourceId = resource.getId(); + } + + try (final XMLResource resource = (XMLResource)testCollection.getResource(resourceId)) { + assertNotNull(resource); + Node node = resource.getContentAsDOM(); + + OutputFormat format = new OutputFormat( ); + format.setLineWidth(0); + format.setIndent(5); + format.setPreserveSpace(true); + try (final UnsynchronizedByteArrayOutputStream out = new UnsynchronizedByteArrayOutputStream()) { + XMLSerializer serializer = new XMLSerializer(out, format); + + if (node instanceof Document) { + serializer.serialize((Document) node); + } else if (node instanceof Element) { + serializer.serialize((Element) node); + } else { + fail("Can't serialize node type: " + node); + } + } } } } @Test public void serialize3() throws ParserConfigurationException, SAXException, IOException, XMLDBException, TransformerException, URISyntaxException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - Document doc = javax.xml.parsers.DocumentBuilderFactory.newInstance( ).newDocumentBuilder().parse(Paths.get(testFile.toURI()).toFile()); - XMLResource resource = testCollection.createResource(null, XMLResource.class); - resource.setContentAsDOM(doc); - testCollection.storeResource(resource); - - resource = (XMLResource)testCollection.getResource(resource.getId()); - assertNotNull(resource); - Node node = resource.getContentAsDOM(); - - try (final StringBuilderWriter writer = new StringBuilderWriter()) { - Properties outputProperties = new Properties(); - outputProperties.setProperty("indent", "yes"); - DOMSerializer serializer = new DOMSerializer(writer, outputProperties); - serializer.serialize(node); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + Document doc = javax.xml.parsers.DocumentBuilderFactory.newInstance( ).newDocumentBuilder().parse(Paths.get(testFile.toURI()).toFile()); + final String resourceId; + try (final XMLResource resource = testCollection.createResource(null, XMLResource.class)) { + resource.setContentAsDOM(doc); + testCollection.storeResource(resource); + resourceId = resource.getId(); + } + + try (final XMLResource resource = (XMLResource)testCollection.getResource(resourceId)) { + assertNotNull(resource); + Node node = resource.getContentAsDOM(); + + try (final StringBuilderWriter writer = new StringBuilderWriter()) { + Properties outputProperties = new Properties(); + outputProperties.setProperty("indent", "yes"); + DOMSerializer serializer = new DOMSerializer(writer, outputProperties); + serializer.serialize(node); + } + } } } @Test public void serialize4() throws ParserConfigurationException, SAXException, IOException, XMLDBException, URISyntaxException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { - Document doc = javax.xml.parsers.DocumentBuilderFactory.newInstance( ).newDocumentBuilder().parse(Paths.get(testFile.toURI()).toFile()); - XMLResource resource = testCollection.createResource(null, XMLResource.class); - resource.setContentAsDOM(doc); + Document doc = javax.xml.parsers.DocumentBuilderFactory.newInstance( ).newDocumentBuilder().parse(Paths.get(testFile.toURI()).toFile()); + final String resourceId; + try (final XMLResource resource = testCollection.createResource(null, XMLResource.class)) { + resource.setContentAsDOM(doc); - testCollection.storeResource(resource); + testCollection.storeResource(resource); + resourceId = resource.getId(); + } - resource = (XMLResource)testCollection.getResource(resource.getId()); - assertNotNull(resource); - @SuppressWarnings("unused") - Node node = resource.getContentAsDOM(); - try (final StringBuilderWriter writer = new StringBuilderWriter()) { - Properties outputProperties = new Properties(); - outputProperties.setProperty("indent", "yes"); - SAXSerializer serializer = new SAXSerializer(writer, outputProperties); - resource.getContentAsSAX(serializer); + try (final XMLResource resource = (XMLResource)testCollection.getResource(resourceId)) { + assertNotNull(resource); + @SuppressWarnings("unused") + Node node = resource.getContentAsDOM(); + try (final StringBuilderWriter writer = new StringBuilderWriter()) { + Properties outputProperties = new Properties(); + outputProperties.setProperty("indent", "yes"); + SAXSerializer serializer = new SAXSerializer(writer, outputProperties); + resource.getContentAsSAX(serializer); + } + } } } @Test public void serialize5() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - XMLResource resource = testCollection.createResource("test.xml", XMLResource.class); - resource.setContent(XML_DATA); - - testCollection.storeResource(resource); - - XMLResource style = testCollection.createResource("test.xsl", XMLResource.class); - style.setContent(XSL_DATA); - testCollection.storeResource(style); - - Properties outputProperties = new Properties(); - outputProperties.setProperty("indent", "yes"); - testCollection.setProperty("stylesheet", "test.xsl"); - testCollection.setProperty("stylesheet-param.testparam", "TEST"); - try (final StringBuilderWriter writer = new StringBuilderWriter()) { - SAXSerializer serializer = new SAXSerializer(writer, outputProperties); - resource.getContentAsSAX(serializer); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + try (final XMLResource resource = testCollection.createResource("test.xml", XMLResource.class)) { + resource.setContent(XML_DATA); + + testCollection.storeResource(resource); + + try (final XMLResource style = testCollection.createResource("test.xsl", XMLResource.class)) { + style.setContent(XSL_DATA); + testCollection.storeResource(style); + } + + Properties outputProperties = new Properties(); + outputProperties.setProperty("indent", "yes"); + testCollection.setProperty("stylesheet", "test.xsl"); + testCollection.setProperty("stylesheet-param.testparam", "TEST"); + try (final StringBuilderWriter writer = new StringBuilderWriter()) { + SAXSerializer serializer = new SAXSerializer(writer, outputProperties); + resource.getContentAsSAX(serializer); + } + } } } } \ No newline at end of file diff --git a/exist-core/src/test/java/org/exist/xmldb/IndexingTest.java b/exist-core/src/test/java/org/exist/xmldb/IndexingTest.java index ef52e072d3..1d47ecab8f 100644 --- a/exist-core/src/test/java/org/exist/xmldb/IndexingTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/IndexingTest.java @@ -129,53 +129,49 @@ public void irregularilyStructured() } private void irregularilyStructured(boolean getContentAsDOM) - throws XMLDBException, ParserConfigurationException, SAXException, IOException, ClassNotFoundException, InstantiationException, IllegalAccessException { - Database database = null; - final String testName = "IrregularilyStructured"; + throws XMLDBException, ParserConfigurationException, SAXException, IOException { startTime = System.currentTimeMillis(); - Collection coll = - DatabaseManager.getCollection(baseURI, username, password); - XMLResource resource = - coll.createResource( - name, - XMLResource.class); - - Document doc = - DocumentBuilderFactory - .newInstance() - .newDocumentBuilder() - .newDocument(); - effectiveSiblingCount = populate(doc); - resource.setContentAsDOM(doc); - coll.storeResource(resource); - coll.close(); - - coll = DatabaseManager.getCollection(baseURI, username, password); - resource = (XMLResource) coll.getResource(name); - - Node n; - if (getContentAsDOM) { - n = resource.getContentAsDOM(); - } else { - String s = (String) resource.getContent(); - byte[] bytes = s.getBytes(UTF_8); - UnsynchronizedByteArrayInputStream bais = new UnsynchronizedByteArrayInputStream(bytes); - DocumentBuilder db = - DocumentBuilderFactory.newInstance().newDocumentBuilder(); - n = db.parse(bais); + try (final Collection coll = DatabaseManager.getCollection(baseURI, username, password); + final XMLResource resource = coll.createResource(name, XMLResource.class)) { + + Document doc = + DocumentBuilderFactory + .newInstance() + .newDocumentBuilder() + .newDocument(); + effectiveSiblingCount = populate(doc); + resource.setContentAsDOM(doc); + coll.storeResource(resource); } - Element documentElement = null; - if (n instanceof Element) { - documentElement = (Element) n; - } else if (n instanceof Document) { - documentElement = ((Document) n).getDocumentElement(); - } + try (final Collection coll = DatabaseManager.getCollection(baseURI, username, password); + final XMLResource resource = (XMLResource) coll.getResource(name)) { + + Node n; + if (getContentAsDOM) { + n = resource.getContentAsDOM(); + } else { + String s = (String) resource.getContent(); + byte[] bytes = s.getBytes(UTF_8); + try (final UnsynchronizedByteArrayInputStream bais = new UnsynchronizedByteArrayInputStream(bytes)) { + DocumentBuilder db = + DocumentBuilderFactory.newInstance().newDocumentBuilder(); + n = db.parse(bais); + } + } - assertions(documentElement); + Element documentElement = null; + if (n instanceof Element) { + documentElement = (Element) n; + } else if (n instanceof Document) { + documentElement = ((Document) n).getDocumentElement(); + } - coll.removeResource(resource); + assertions(documentElement); + + coll.removeResource(resource); + } } /** diff --git a/exist-core/src/test/java/org/exist/xmldb/LocalCollectionTest.java b/exist-core/src/test/java/org/exist/xmldb/LocalCollectionTest.java index ed8c60fa3b..e3848ffcc5 100644 --- a/exist-core/src/test/java/org/exist/xmldb/LocalCollectionTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/LocalCollectionTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -56,6 +80,10 @@ public static void setup() throws XMLDBException { @AfterClass public static void cleanup() throws XMLDBException { + if (testCollection != null) { + testCollection.close(); + testCollection = null; + } final CollectionManagementService cms = existEmbeddedServer .getRoot() .getService(CollectionManagementService.class); diff --git a/exist-core/src/test/java/org/exist/xmldb/LocalXMLResourceDOMTest.java b/exist-core/src/test/java/org/exist/xmldb/LocalXMLResourceDOMTest.java index 914c117cd7..c3c1f77b7f 100644 --- a/exist-core/src/test/java/org/exist/xmldb/LocalXMLResourceDOMTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/LocalXMLResourceDOMTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -19,7 +43,6 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - package org.exist.xmldb; import org.exist.test.ExistXmldbEmbeddedServer; @@ -31,7 +54,6 @@ import org.w3c.dom.Node; import org.xmldb.api.base.Collection; import org.xmldb.api.base.ResourceIterator; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -55,14 +77,16 @@ public static void setup() throws XMLDBException { .getRoot() .getService(CollectionManagementService.class); - final Collection coll = cms.createCollection(TestConstants.TEST_COLLECTION_URI.lastSegment().toString()); + try (final Collection coll = cms.createCollection(TestConstants.TEST_COLLECTION_URI.lastSegment().toString())) { - final XMLResource r = coll.createResource( - TEST_RESOURCE_NAME, - XMLResource.class - ); - r.setContent("Table"); - coll.storeResource(r); + try (final XMLResource r = coll.createResource( + TEST_RESOURCE_NAME, + XMLResource.class + )) { + r.setContent("Table"); + coll.storeResource(r); + } + } } @AfterClass @@ -78,43 +102,48 @@ public static void cleanup() throws XMLDBException { public void testEnhancer01() throws XMLDBException { final String query = "doc('" + TestConstants.TEST_COLLECTION_URI.getRawCollectionPath() + "/" + TEST_RESOURCE_NAME + "')//properties[property[@key eq 'type'][text() eq 'Table']]"; - final ResourceSet rs1 = existEmbeddedServer.executeQuery(query); - final ResourceSet rs2 = existEmbeddedServer.executeQuery(query); + try (final EXistResourceSet rs1 = existEmbeddedServer.executeQuery(query); + final EXistResourceSet rs2 = existEmbeddedServer.executeQuery(query)) { - final ResourceIterator i1 = rs1.getIterator(); - final ResourceIterator i2 = rs2.getIterator(); + final ResourceIterator i1 = rs1.getIterator(); + final ResourceIterator i2 = rs2.getIterator(); - for (; i1.hasMoreResources() && i1.hasMoreResources(); ) { + for (; i1.hasMoreResources() && i1.hasMoreResources(); ) { - final XMLResource r1 = (XMLResource) i1.nextResource(); - final XMLResource r2 = (XMLResource) i2.nextResource(); + try (final XMLResource r1 = (XMLResource) i1.nextResource(); + final XMLResource r2 = (XMLResource) i2.nextResource()) { - assertEquals(r1.getContentAsDOM(), r2.getContentAsDOM()); + assertEquals(r1.getContentAsDOM(), r2.getContentAsDOM()); + } + } } } @Test public void testEnhancer02() throws XMLDBException { - - final ResourceSet rs1 = existEmbeddedServer.executeQuery( - "doc('" + TestConstants.TEST_COLLECTION_URI.getRawCollectionPath() + "/" + TEST_RESOURCE_NAME + "')//properties/property[@key='type' and text()='Table']" - ); - for (final ResourceIterator i1 = rs1.getIterator(); i1.hasMoreResources(); ) { - final XMLResource r1 = (XMLResource) i1.nextResource(); - - final Map variables = new HashMap<>(); - variables.put("local:document", r1.getContentAsDOM()); - - final String query = "xquery version \"1.0\";" - + "declare namespace xmldb=\"http://exist-db.org/xquery/xmldb\";" - + "declare variable $local:document external;" - + "$local:document"; - final ResourceSet rs2 = existEmbeddedServer.executeQuery(query, variables); - - for (final ResourceIterator i2 = rs2.getIterator(); i2.hasMoreResources(); ) { - final XMLResource r2 = (XMLResource) i2.nextResource(); - final Node content2 = r2.getContentAsDOM(); - assertNotNull(content2); + try (final EXistResourceSet rs1 = existEmbeddedServer.executeQuery( + "doc('" + TestConstants.TEST_COLLECTION_URI.getRawCollectionPath() + "/" + TEST_RESOURCE_NAME + "')//properties/property[@key='type' and text()='Table']" + )) { + for (final ResourceIterator i1 = rs1.getIterator(); i1.hasMoreResources(); ) { + try (final XMLResource r1 = (XMLResource) i1.nextResource()) { + + final Map variables = new HashMap<>(); + variables.put("local:document", r1.getContentAsDOM()); + + final String query = "xquery version \"1.0\";" + + "declare namespace xmldb=\"http://exist-db.org/xquery/xmldb\";" + + "declare variable $local:document external;" + + "$local:document"; + try (final EXistResourceSet rs2 = existEmbeddedServer.executeQuery(query, variables)) { + + for (final ResourceIterator i2 = rs2.getIterator(); i2.hasMoreResources(); ) { + try (final XMLResource r2 = (XMLResource) i2.nextResource()) { + final Node content2 = r2.getContentAsDOM(); + assertNotNull(content2); + } + } + } + } } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/MoveCollectionTest.java b/exist-core/src/test/java/org/exist/xmldb/MoveCollectionTest.java index c196ca73c2..158acada3e 100644 --- a/exist-core/src/test/java/org/exist/xmldb/MoveCollectionTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/MoveCollectionTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -81,38 +105,46 @@ public void move() throws XMLDBException { * /db/testMove/0/X/Y */ EXistCollectionManagementService service = testCollection.getService(EXistCollectionManagementService.class); - final Collection zeroCollection = service.createCollection(ZERO_COLLECTION_NAME); - assertNotNull(zeroCollection); - - final Collection oneCollection = service.createCollection(ONE_COLLECTION_NAME); - assertNotNull(oneCollection); - - service = zeroCollection.getService(EXistCollectionManagementService.class); - final Collection xCollection = service.createCollection(X_COLLECTION_NAME); - assertNotNull(xCollection); - - service = xCollection.getService(EXistCollectionManagementService.class); - final Collection yCollection = service.createCollection(Y_COLLECTION_NAME); - assertNotNull(yCollection); - - // move the collection /db/testMove/0/X to /db/testMove/1 - service = zeroCollection.getService(EXistCollectionManagementService.class); - service.move(XmldbURI.create(X_COLLECTION_NAME), XmldbURI.create(oneCollection.getName()), null); + try (final Collection zeroCollection = service.createCollection(ZERO_COLLECTION_NAME); + final Collection oneCollection = service.createCollection(ONE_COLLECTION_NAME)) { + assertNotNull(zeroCollection); + + assertNotNull(oneCollection); + + service = zeroCollection.getService(EXistCollectionManagementService.class); + try (final Collection xCollection = service.createCollection(X_COLLECTION_NAME)) { + assertNotNull(xCollection); + + service = xCollection.getService(EXistCollectionManagementService.class); + try (final Collection yCollection = service.createCollection(Y_COLLECTION_NAME)) { + assertNotNull(yCollection); + } + + // move the collection /db/testMove/0/X to /db/testMove/1 + service = zeroCollection.getService(EXistCollectionManagementService.class); + service.move(XmldbURI.create(X_COLLECTION_NAME), XmldbURI.create(oneCollection.getName()), null); + } + } } @Before public void setUp() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService service = root.getService(CollectionManagementService.class); - testCollection = service.createCollection(TEST_COLLECTION_NAME); - assertNotNull(testCollection); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + testCollection = service.createCollection(TEST_COLLECTION_NAME); + assertNotNull(testCollection); + } } @After public void tearDown() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService service = root.getService(CollectionManagementService.class); - service.removeCollection(TEST_COLLECTION_NAME); - testCollection = null; + if (testCollection != null) { + testCollection.close(); + testCollection = null; + } + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + service.removeCollection(TEST_COLLECTION_NAME); + } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/MultiDBTest.java b/exist-core/src/test/java/org/exist/xmldb/MultiDBTest.java index 15e73ce5ce..ccca5911de 100644 --- a/exist-core/src/test/java/org/exist/xmldb/MultiDBTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/MultiDBTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -29,7 +53,11 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.Database; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.ResourceIterator; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -60,36 +88,36 @@ public class MultiDBTest { @Test public void store() throws XMLDBException, IOException { for (int i = 0; i < INSTANCE_COUNT; i++) { - Collection root = DatabaseManager.getCollection("xmldb:test" + i + "://" + XmldbURI.ROOT_COLLECTION, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - Collection test = root.getChildCollection("test"); - if (test == null) { - CollectionManagementService service = root.getService(CollectionManagementService.class); - test = service.createCollection("test"); + try (final Collection root = DatabaseManager.getCollection("xmldb:test" + i + "://" + XmldbURI.ROOT_COLLECTION, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + + try (final Collection test = service.createCollection("test")) { + for (final String sampleName : SAMPLES.getShakespeareXmlSampleNames()) { + loadFile(SAMPLES.getShakespeareSample(sampleName), test, sampleName); + } + doQuery(test, "//SPEECH[SPEAKER='HAMLET']"); + } } - - for (final String sampleName : SAMPLES.getShakespeareXmlSampleNames()) { - loadFile(SAMPLES.getShakespeareSample(sampleName), test, sampleName); - } - - doQuery(test, "//SPEECH[SPEAKER='HAMLET']"); } } protected static void loadFile(final InputStream is, final Collection collection, final String fileName) throws XMLDBException, IOException { // create new XMLResource; an id will be assigned to the new resource - XMLResource document = - collection.createResource(fileName, - XMLResource.class); - document.setContent(InputStreamUtil.readString(is, UTF_8)); - collection.storeResource(document); + try (final XMLResource document = collection.createResource(fileName, XMLResource.class)) { + document.setContent(InputStreamUtil.readString(is, UTF_8)); + collection.storeResource(document); + } } private static void doQuery(Collection collection, String query) throws XMLDBException { - EXistXQueryService service = collection.getService(EXistXQueryService.class); - ResourceSet result = service.query(query); - for (ResourceIterator i = result.getIterator(); i.hasMoreResources(); ) { - @SuppressWarnings("unused") - String content = i.nextResource().getContent().toString(); + final EXistXQueryService service = collection.getService(EXistXQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + for (ResourceIterator i = result.getIterator(); i.hasMoreResources(); ) { + try (final Resource resource = i.nextResource()) { + @SuppressWarnings("unused") + final String content = resource.getContent().toString(); + } + } } } @@ -120,12 +148,13 @@ public void setUp() throws ClassNotFoundException, IOException, IllegalAccessExc @After public void tearDown() throws XMLDBException { for (int i = 0; i < INSTANCE_COUNT; i++) { - Collection root = DatabaseManager.getCollection("xmldb:test" + i + "://" + XmldbURI.ROOT_COLLECTION, "admin", ""); - final CollectionManagementService service = root.getService(CollectionManagementService.class); - service.removeCollection("test"); + try (final Collection root = DatabaseManager.getCollection("xmldb:test" + i + "://" + XmldbURI.ROOT_COLLECTION, "admin", "")) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + service.removeCollection("test"); - final DatabaseInstanceManager mgr = root.getService(DatabaseInstanceManager.class); - mgr.shutdown(); + final DatabaseInstanceManager mgr = root.getService(DatabaseInstanceManager.class); + mgr.shutdown(); + } } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/RemoteCollectionTest.java b/exist-core/src/test/java/org/exist/xmldb/RemoteCollectionTest.java index 0ec08789d2..99516cb40b 100644 --- a/exist-core/src/test/java/org/exist/xmldb/RemoteCollectionTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/RemoteCollectionTest.java @@ -55,8 +55,17 @@ import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; -import org.xmldb.api.modules.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.Service; +import org.xmldb.api.base.ServiceProviderCache; +import org.xmldb.api.base.XMLDBException; +import org.xmldb.api.modules.BinaryResource; +import org.xmldb.api.modules.CollectionManagementService; +import org.xmldb.api.modules.XMLResource; +import org.xmldb.api.modules.XPathQueryService; +import org.xmldb.api.modules.XQueryService; +import org.xmldb.api.modules.XUpdateQueryService; import org.xmlunit.builder.DiffBuilder; import org.xmlunit.builder.Input; import org.xmlunit.diff.Diff; @@ -107,8 +116,8 @@ public void getServices() throws XMLDBException { XPathQueryService.class, XQueryService.class, XUpdateQueryService.class, RemoteXPathQueryService.class, RemoteCollectionManagementService.class, RemoteUserManagementService.class, RemoteDatabaseInstanceManager.class, RemoteIndexQueryService.class, RemoteXUpdateQueryService.class); - RemoteCollection colTest = getCollection(); - for (Class expectedServiceType : expectedServiceTypes) { + final RemoteCollection colTest = getCollection(); + for (final Class expectedServiceType : expectedServiceTypes) { assertTrue(colTest.hasService(expectedServiceType)); assertNotNull(colTest.getService(expectedServiceType)); } @@ -116,7 +125,8 @@ public void getServices() throws XMLDBException { @Test public void isRemoteCollection() throws XMLDBException { - assertTrue(getCollection().isRemoteCollection()); + final RemoteCollection collection = getCollection(); + assertTrue(collection.isRemoteCollection()); } @Test @@ -127,122 +137,134 @@ public void getPath() throws XMLDBException { @Test public void createXmlResourceFromString() throws XMLDBException { final Collection collection = getCollection(); - final String resourceName = "testresource.xml"; - final Resource resource = collection.createResource(resourceName, XMLResource.class); - assertNotNull(resource); - assertEquals(collection, resource.getParentCollection()); + final String resourceName = "testresource.xml"; final String xml = "" + System.currentTimeMillis() + ""; - resource.setContent(xml); - collection.storeResource(resource); - final Resource retrievedResource = collection.getResource(resourceName); - assertNotNull(retrievedResource); - assertEquals(XML_RESOURCE, retrievedResource.getResourceType()); - assertTrue(retrievedResource instanceof XMLResource); - final String result = (String) retrievedResource.getContent(); - assertNotNull(result); + try (final Resource resource = collection.createResource(resourceName, XMLResource.class)) { + assertNotNull(resource); + assertEquals(collection, resource.getParentCollection()); + resource.setContent(xml); + collection.storeResource(resource); + } + + try (final Resource retrievedResource = collection.getResource(resourceName)) { + assertNotNull(retrievedResource); + assertEquals(XML_RESOURCE, retrievedResource.getResourceType()); + assertTrue(retrievedResource instanceof XMLResource); + final String result = (String) retrievedResource.getContent(); + assertNotNull(result); - final Source expected = Input.fromString(xml).build(); - final Source actual = Input.fromString(result).build(); + final Source expected = Input.fromString(xml).build(); + final Source actual = Input.fromString(result).build(); - final Diff diff = DiffBuilder.compare(expected) + final Diff diff = DiffBuilder.compare(expected) .withTest(actual) .checkForSimilar() .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + assertFalse(diff.toString(), diff.hasDifferences()); + } } @Test public void createBinaryResourceFromString() throws XMLDBException { final Collection collection = getCollection(); - final String resourceName = "testresource.bin"; - final Resource resource = collection.createResource(resourceName, BinaryResource.class); - assertNotNull(resource); - assertEquals(collection, resource.getParentCollection()); + final String resourceName = "testresource.bin"; final String bin = "binary data: " + System.currentTimeMillis(); - resource.setContent(bin); - collection.storeResource(resource); - - final Resource retrievedResource = collection.getResource(resourceName); - assertNotNull(retrievedResource); - assertEquals(BINARY_RESOURCE, retrievedResource.getResourceType()); - assertTrue(retrievedResource instanceof BinaryResource); - final byte[] result = (byte[]) retrievedResource.getContent(); - assertNotNull(result); - assertEquals(bin, new String(result, UTF_8)); + + try (final Resource resource = collection.createResource(resourceName, BinaryResource.class)) { + assertNotNull(resource); + assertEquals(collection, resource.getParentCollection()); + resource.setContent(bin); + collection.storeResource(resource); + } + + try (final Resource retrievedResource = collection.getResource(resourceName)) { + assertNotNull(retrievedResource); + assertEquals(BINARY_RESOURCE, retrievedResource.getResourceType()); + assertTrue(retrievedResource instanceof BinaryResource); + final byte[] result = (byte[]) retrievedResource.getContent(); + assertNotNull(result); + assertEquals(bin, new String(result, UTF_8)); + } } @Test public void createEmptyBinaryResource() throws XMLDBException, IOException { final Collection collection = getCollection(); - final String resourceName = "empty.dtd"; - final Resource resource = collection.createResource(resourceName, BinaryResource.class); - ((EXistResource) resource).setMediaType(MediaType.APPLICATION_XML_DTD); + final String resourceName = "empty.dtd"; final byte[] bin = new byte[0]; - try (final InputStream is = new UnsynchronizedByteArrayInputStream(bin)) { - final InputSource inputSource = new InputSource(); - inputSource.setByteStream(is); - inputSource.setSystemId("empty.dtd"); - resource.setContent(inputSource); - collection.storeResource(resource); + try (final Resource resource = collection.createResource(resourceName, BinaryResource.class)) { + ((EXistResource) resource).setMediaType(MediaType.APPLICATION_XML_DTD); + + try (final InputStream is = new UnsynchronizedByteArrayInputStream(bin)) { + final InputSource inputSource = new InputSource(); + inputSource.setByteStream(is); + inputSource.setSystemId("empty.dtd"); + + resource.setContent(inputSource); + collection.storeResource(resource); + } } - final Resource retrievedResource = collection.getResource(resourceName); - assertNotNull(retrievedResource); - assertEquals(BINARY_RESOURCE, retrievedResource.getResourceType()); - assertTrue(retrievedResource instanceof BinaryResource); - final byte[] result = (byte[]) retrievedResource.getContent(); - assertNotNull(result); - assertArrayEquals(bin, result); + try (final Resource retrievedResource = collection.getResource(resourceName)) { + assertNotNull(retrievedResource); + assertEquals(BINARY_RESOURCE, retrievedResource.getResourceType()); + assertTrue(retrievedResource instanceof BinaryResource); + final byte[] result = (byte[]) retrievedResource.getContent(); + assertNotNull(result); + assertArrayEquals(bin, result); + } } @Test /* issue 1874 */ public void createXMLFileResource() throws XMLDBException, IOException { - Collection collection = getCollection(); - final Resource resource = collection.createResource("testresource", XMLResource.class); - assertNotNull(resource); - assertEquals(collection, resource.getParentCollection()); - - final String sometxt = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; - final Path path = Files.createTempFile("test-createXMLFileResource", ".xml"); - final StringBuilder sb = new StringBuilder(); - sb.append(""); - for (int i = 0; i < 5000; i++) { - sb.append("").append(sometxt).append(""); + final Collection collection = getCollection(); + try (final Resource resource = collection.createResource("testresource", XMLResource.class)) { + assertNotNull(resource); + assertEquals(collection, resource.getParentCollection()); + + final String sometxt = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + final Path path = Files.createTempFile("test-createXMLFileResource", ".xml"); + final StringBuilder sb = new StringBuilder(); + sb.append(""); + for (int i = 0; i < 5000; i++) { + sb.append("").append(sometxt).append(""); + } + sb.append(""); + Files.copy(new UnsynchronizedByteArrayInputStream(sb.toString().getBytes()), path, StandardCopyOption.REPLACE_EXISTING); + resource.setContent(path); + collection.storeResource(resource); } - sb.append(""); - Files.copy(new UnsynchronizedByteArrayInputStream(sb.toString().getBytes()), path, StandardCopyOption.REPLACE_EXISTING); - resource.setContent(path); - collection.storeResource(resource); } @Test public void getNonExistentResource() throws XMLDBException { - Collection collection = getCollection(); - Resource resource = collection.getResource("unknown.xml"); - assertNull(resource); + final Collection collection = getCollection(); + try (final Resource resource = collection.getResource("unknown.xml")) { + assertNull(resource); + } } @Test public void listResources() throws XMLDBException { - ArrayList xmlNames = new ArrayList<>(); + final List xmlNames = new ArrayList<>(); xmlNames.add("xml1"); xmlNames.add("xml2"); xmlNames.add("xml3"); createResources(xmlNames, XMLResource.class); - ArrayList binaryNames = new ArrayList<>(); + final List binaryNames = new ArrayList<>(); binaryNames.add("b1"); binaryNames.add("b2"); createResources(binaryNames, BinaryResource.class); - for (String resource : getCollection().listResources()) { + for (final String resource : getCollection().listResources()) { xmlNames.remove(resource); binaryNames.remove(resource); } @@ -256,30 +278,37 @@ public void listResources() throws XMLDBException { */ @Test public void parent() throws XMLDBException { - Collection c = DatabaseManager.getCollection(getUri() + XmldbURI.ROOT_COLLECTION, "admin", ""); - assertNull(c.getChildCollection("b")); + final String parentName; + try (final Collection c = DatabaseManager.getCollection(getUri() + XmldbURI.ROOT_COLLECTION, "admin", "")) { + assertNull(c.getChildCollection("b")); + parentName = c.getName() + "/" + System.currentTimeMillis(); + } + - String parentName = c.getName() + "/" + System.currentTimeMillis(); - String colName = parentName + "/a"; - c = DatabaseManager.getCollection(getUri() + parentName, "admin", ""); - assertNull(c); + final String colName = parentName + "/a"; + try (final Collection c = DatabaseManager.getCollection(getUri() + parentName, "admin", "")) { + assertNull(c); + } // following fails for XmlDb 20051203 - c = DatabaseManager.getCollection(getUri() + colName, "admin", ""); - assertNull(c); + try (final Collection c = DatabaseManager.getCollection(getUri() + colName, "admin", "")) { + assertNull(c); + } } @Test /* issue 2743 */ - public void getLoadRemoteResourceContentBiggerThan16MB() throws XMLDBException, SAXException { + public void getLoadRemoteResourceContentBiggerThan16MB() throws XMLDBException, SAXException, IOException { Collection collection = getCollection(); - final RemoteXMLResource resource = (RemoteXMLResource)collection.createResource("testresource", XMLResource.class); - prepareContent(resource); - collection.storeResource(resource); - // load stored content - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - resource.getContentIntoAStream(outputStream); - // compare size - assertEquals(16777229, outputStream.size()); + try (final RemoteXMLResource resource = (RemoteXMLResource)collection.createResource("testresource", XMLResource.class)) { + prepareContent(resource); + collection.storeResource(resource); + // load stored content + try (final ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + resource.getContentIntoAStream(outputStream); + // compare size + assertEquals(16777229, outputStream.size()); + } + } } @Test @@ -317,8 +346,8 @@ public void getService() throws XMLDBException { @Test public void registerProvders() { - RemoteCollection remoteCollection = (RemoteCollection)getCollection(); - ServiceProviderCache.ProviderRegistry registry = createMock(ServiceProviderCache.ProviderRegistry.class); + RemoteCollection remoteCollection = getCollection(); + final ServiceProviderCache.ProviderRegistry registry = createMock(ServiceProviderCache.ProviderRegistry.class); registry.add(eq(XPathQueryService.class), notNull()); registry.add(eq(XQueryService.class), notNull()); @@ -343,13 +372,13 @@ public void listChildCollections() throws XMLDBException { @Test public void getChildCollections() throws XMLDBException { - RemoteCollection remoteCollection = (RemoteCollection)getCollection(); + final RemoteCollection remoteCollection = getCollection(); assertArrayEquals(new Collection[0], remoteCollection.getChildCollections()); } @Test public void getResources() throws XMLDBException { - RemoteCollection remoteCollection = (RemoteCollection)getCollection(); + final RemoteCollection remoteCollection = getCollection(); assertArrayEquals(new org.exist.Resource[0], remoteCollection.getResources()); } @@ -358,10 +387,10 @@ public void getCreationTime() throws XMLDBException { assertNotNull(getCollection().getCreationTime()); } - private void prepareContent(RemoteXMLResource resource) throws XMLDBException, SAXException { + private void prepareContent(final RemoteXMLResource resource) throws XMLDBException, SAXException { final char[] buffer = new char[16 * 1024 * 1024]; Arrays.fill(buffer, (char) 'x'); - ContentHandler content = resource.setContentAsSAX(); + final ContentHandler content = resource.setContentAsSAX(); content.startDocument(); content.startElement("", "root", "root", new AttributesImpl()); // writing 16 mb to resource @@ -370,15 +399,17 @@ private void prepareContent(RemoteXMLResource resource) throws XMLDBException, S content.endDocument(); } - private void createResources(ArrayList names, Class type) throws XMLDBException { - for (String name : names) { - Resource res = getCollection().createResource(name, type); - if (res instanceof XMLResource) { - res.setContent(XML_CONTENT); - } else if (res instanceof BinaryResource) { - res.setContent(BINARY_CONTENT); + private void createResources(final List names, final Class type) throws XMLDBException { + final Collection collection = getCollection(); + for (final String name : names) { + try (final Resource res = collection.createResource(name, type)) { + if (res instanceof XMLResource) { + res.setContent(XML_CONTENT); + } else if (res instanceof BinaryResource) { + res.setContent(BINARY_CONTENT); + } + collection.storeResource(res); } - getCollection().storeResource(res); } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/RemoteDBTest.java b/exist-core/src/test/java/org/exist/xmldb/RemoteDBTest.java index b0ccde4d7c..b7b898055e 100644 --- a/exist-core/src/test/java/org/exist/xmldb/RemoteDBTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/RemoteDBTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -53,43 +77,36 @@ public static String getUri() { protected void setUpRemoteDatabase() throws ClassNotFoundException, IllegalAccessException, InstantiationException, XMLDBException { //Connect to the DB - Class cl = Class.forName(DB_DRIVER); - Database database = (Database) cl.newInstance(); + final Class cl = Class.forName(DB_DRIVER); + final Database database = (Database) cl.newInstance(); assertNotNull(database); DatabaseManager.registerDatabase(database); //Get the root collection... - Collection rootCollection = DatabaseManager.getCollection(getUri() + XmldbURI.ROOT_COLLECTION, "admin", ""); - assertNotNull(rootCollection); - CollectionManagementService cms = rootCollection.getService( - CollectionManagementService.class); - //Creates the child collection - Collection childCollection = cms.createCollection(CHILD_COLLECTION); - assertNotNull(childCollection); - //... and work from it - setCollection((RemoteCollection) childCollection); - assertNotNull(childCollection); + try (final Collection rootCollection = DatabaseManager.getCollection(getUri() + XmldbURI.ROOT_COLLECTION, "admin", "")) { + assertNotNull(rootCollection); + final CollectionManagementService cms = rootCollection.getService(CollectionManagementService.class); + //Creates the child collection + //... and work from it + this.collection = (RemoteCollection) cms.createCollection(CHILD_COLLECTION); + assertNotNull(this.collection); + } } protected void removeCollection() { - try { - Collection rootCollection = DatabaseManager.getCollection(getUri() + XmldbURI.ROOT_COLLECTION, "admin", ""); - assertNotNull(rootCollection); - CollectionManagementService cms = rootCollection.getService( - CollectionManagementService.class); - cms.removeCollection(CHILD_COLLECTION); - } catch (Exception e) { + collection.close(); + try (final Collection rootCollection = DatabaseManager.getCollection(getUri() + XmldbURI.ROOT_COLLECTION, "admin", "")) { + assertNotNull(rootCollection); + final CollectionManagementService cms = rootCollection.getService(CollectionManagementService.class); + cms.removeCollection(CHILD_COLLECTION); + } catch (final Exception e) { fail(e.getMessage()); } } - public RemoteCollection getCollection() { + protected RemoteCollection getCollection() { return collection; } - public void setCollection(RemoteCollection collection) { - this.collection = collection; - } - protected String getTestCollectionName() { return CHILD_COLLECTION; } diff --git a/exist-core/src/test/java/org/exist/xmldb/RemoteDOMTest.java b/exist-core/src/test/java/org/exist/xmldb/RemoteDOMTest.java index 08be730b4f..5845c48f47 100644 --- a/exist-core/src/test/java/org/exist/xmldb/RemoteDOMTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/RemoteDOMTest.java @@ -45,6 +45,7 @@ */ package org.exist.xmldb; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; @@ -83,60 +84,71 @@ public void setUp() throws ClassNotFoundException, IllegalAccessException, Insta rootColl = DatabaseManager.getCollection(getBaseURI(), "admin", ""); assertNotNull(rootColl); - XMLResource r = rootColl.createResource(name, XMLResource.class); - r.setContent("Table"); - rootColl.storeResource(r); + try (final XMLResource r = rootColl.createResource(name, XMLResource.class)) { + r.setContent("Table"); + rootColl.storeResource(r); + } + } + + @After + public void tearDown() throws XMLDBException { + if (rootColl != null) { + rootColl.close(); + rootColl = null; + } } /** test Update of an existing document through DOM */ @Test public void domUpdate() throws XMLDBException { - XMLResource index = (XMLResource) rootColl.getResource(name); - String content = (String) index.getContent(); Document doc=null; Element root=null; NodeList nl=null; - Node n = index.getContentAsDOM(); - if (n instanceof Document) { - doc=(Document)n; - root=doc.getDocumentElement(); - } - else if (n instanceof Element) { - doc = n.getOwnerDocument(); - root=(Element)n; - } - else { - fail("RemoteXMLResource unable to return a Document either an Element"); - } - - nl = doc.getChildNodes(); - for (int i = 0; i < nl.getLength(); i++) { - nl.item(i).getNodeName(); - } + try (final XMLResource index = (XMLResource) rootColl.getResource(name)) { + String content = (String) index.getContent(); + Node n = index.getContentAsDOM(); + if (n instanceof Document) { + doc=(Document)n; + root=doc.getDocumentElement(); + } + else if (n instanceof Element) { + doc = n.getOwnerDocument(); + root=(Element)n; + } + else { + fail("RemoteXMLResource unable to return a Document either an Element"); + } + nl = doc.getChildNodes(); + for (int i = 0; i < nl.getLength(); i++) { + nl.item(i).getNodeName(); + } - Element schemaNode = doc.createElement("schema"); - schemaNode.setAttribute("targetNamespace", "targetNamespace"); - schemaNode.setAttribute("resourceName", "filename"); - root.appendChild(schemaNode); - index.setContentAsDOM(doc); - rootColl.storeResource(index); + Element schemaNode = doc.createElement("schema"); + schemaNode.setAttribute("targetNamespace", "targetNamespace"); + schemaNode.setAttribute("resourceName", "filename"); - index = (XMLResource) rootColl.getResource(name); - content = (String) index.getContent(); - n = index.getContentAsDOM(); - if (n instanceof Document) { - doc=(Document)n; - root=doc.getDocumentElement(); + root.appendChild(schemaNode); + index.setContentAsDOM(doc); + rootColl.storeResource(index); } - else if (n instanceof Element) { - doc = n.getOwnerDocument(); - root=(Element)n; - } - nl = root.getChildNodes(); - for (int i = 0; i < nl.getLength(); i++) { - nl.item(i).getNodeName(); + + try (final XMLResource index = (XMLResource) rootColl.getResource(name)) { + String content = (String) index.getContent(); + Node n = index.getContentAsDOM(); + if (n instanceof Document) { + doc=(Document)n; + root=doc.getDocumentElement(); + } + else if (n instanceof Element) { + doc = n.getOwnerDocument(); + root=(Element)n; + } + nl = root.getChildNodes(); + for (int i = 0; i < nl.getLength(); i++) { + nl.item(i).getNodeName(); + } } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/RemoteDatabaseImplTest.java b/exist-core/src/test/java/org/exist/xmldb/RemoteDatabaseImplTest.java index 381e6ecf9f..2dfd09fb23 100644 --- a/exist-core/src/test/java/org/exist/xmldb/RemoteDatabaseImplTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/RemoteDatabaseImplTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -55,28 +79,31 @@ public void testGetCollection() throws ClassNotFoundException, IllegalAccessExce Database database = (Database) cl.newInstance(); DatabaseManager.registerDatabase(database); - Collection rootCollection = DatabaseManager.getCollection(getUri() + XmldbURI.ROOT_COLLECTION, "admin", ""); + try (final Collection rootCollection = DatabaseManager.getCollection(getUri() + XmldbURI.ROOT_COLLECTION, "admin", "")) { - CollectionManagementService cms = rootCollection.getService(CollectionManagementService.class); - Collection adminCollection = cms.createCollection(ADMIN_COLLECTION_NAME); - UserManagementService ums = rootCollection.getService(UserManagementService.class); - if (ums != null) { - Permission p = ums.getPermissions(adminCollection); - p.setMode(Permission.USER_STRING + "=+read,+write," + Permission.GROUP_STRING + "=-read,-write," + Permission.OTHER_STRING + "=-read,-write"); - ums.setPermissions(adminCollection, p); + CollectionManagementService cms = rootCollection.getService(CollectionManagementService.class); + try (final Collection adminCollection = cms.createCollection(ADMIN_COLLECTION_NAME)) { + UserManagementService ums = rootCollection.getService(UserManagementService.class); + if (ums != null) { + Permission p = ums.getPermissions(adminCollection); + p.setMode(Permission.USER_STRING + "=+read,+write," + Permission.GROUP_STRING + "=-read,-write," + Permission.OTHER_STRING + "=-read,-write"); + ums.setPermissions(adminCollection, p); - Collection guestCollection = DatabaseManager.getCollection(getUri() + XmldbURI.ROOT_COLLECTION + "/" + ADMIN_COLLECTION_NAME, "guest", "guest"); + try (final Collection guestCollection = DatabaseManager.getCollection(getUri() + XmldbURI.ROOT_COLLECTION + "/" + ADMIN_COLLECTION_NAME, "guest", "guest"); + final Resource resource = guestCollection.createResource("testguest", BinaryResource.class)) { - Resource resource = guestCollection.createResource("testguest", BinaryResource.class); - resource.setContent("123".getBytes()); - try { - guestCollection.storeResource(resource); - fail(); - } catch (XMLDBException e) { + resource.setContent("123".getBytes()); + try { + guestCollection.storeResource(resource); + fail(); + } catch (XMLDBException e) { - } + } + } - cms.removeCollection(ADMIN_COLLECTION_NAME); + cms.removeCollection(ADMIN_COLLECTION_NAME); + } + } } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/RemoteQueryTest.java b/exist-core/src/test/java/org/exist/xmldb/RemoteQueryTest.java index 2c4001d57f..290f924e35 100644 --- a/exist-core/src/test/java/org/exist/xmldb/RemoteQueryTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/RemoteQueryTest.java @@ -61,7 +61,6 @@ import org.xmldb.api.base.CompiledExpression; import org.xmldb.api.base.Database; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; @@ -80,24 +79,26 @@ public class RemoteQueryTest extends RemoteDBTest { @Test public void resourceSet() throws XMLDBException { - String query = "//SPEECH[SPEAKER = 'HAMLET']"; - XQueryService service = testCollection.getService(XQueryService.class); + final String query = "//SPEECH[SPEAKER = 'HAMLET']"; + final XQueryService service = testCollection.getService(XQueryService.class); service.setProperty("highlight-matches", "none"); - CompiledExpression compiled = service.compile(query); - ResourceSet result = service.execute(compiled); + final CompiledExpression compiled = service.compile(query); + try (final EXistResourceSet result = (EXistResourceSet) service.execute(compiled)) { - assertEquals(result.getSize(), 359); + assertEquals(result.getSize(), 359); - for (int i = 0; i < result.getSize(); i++) { - XMLResource r = (XMLResource) result.getResource(i); - Node node = r.getContentAsDOM().getFirstChild(); - } + for (int i = 0; i < result.getSize(); i++) { + try (final XMLResource r = (XMLResource) result.getResource(i)) { + final Node node = r.getContentAsDOM().getFirstChild(); + } + } + } } @Test public void externalVar() throws XMLDBException { - String query = XmlRpcTest.QUERY_MODULE_DATA; - XQueryService service = testCollection.getService(XQueryService.class); + final String query = XmlRpcTest.QUERY_MODULE_DATA; + final XQueryService service = testCollection.getService(XQueryService.class); service.setProperty("highlight-matches", "none"); service.setNamespace("tm", "http://exist-db.org/test/module"); @@ -106,57 +107,60 @@ public void externalVar() throws XMLDBException { service.declareVariable("tm:imported-external-string", "imported-string-value"); service.declareVariable("tm-query:local-external-string", "local-string-value"); - CompiledExpression compiled = service.compile(query); - ResourceSet result = service.execute(compiled); + final CompiledExpression compiled = service.compile(query); + try (final EXistResourceSet result = (EXistResourceSet) service.execute(compiled)) { - assertEquals(result.getSize(), 2); + assertEquals(result.getSize(), 2); - for (int i = 0; i < result.getSize(); i++) { - XMLResource r = (XMLResource) result.getResource(i); + for (int i = 0; i < result.getSize(); i++) { + try (final XMLResource r = (XMLResource) result.getResource(i)) { + // needed to ensure that r is closed + } + } } } @Before public void setUp() throws ClassNotFoundException, IllegalAccessException, InstantiationException, XMLDBException, URISyntaxException, IOException { // initialize driver - Class cl = Class.forName("org.exist.xmldb.DatabaseImpl"); - Database database = (Database) cl.newInstance(); + final Class cl = Class.forName("org.exist.xmldb.DatabaseImpl"); + final Database database = (Database) cl.newInstance(); database.setProperty("create-database", "true"); DatabaseManager.registerDatabase(database); - Collection root = - DatabaseManager.getCollection( - getUri() + XmldbURI.ROOT_COLLECTION, - "admin", - null); - CollectionManagementService service = - root.getService( - CollectionManagementService.class); - testCollection = service.createCollection("test"); - assertNotNull(testCollection); - - Resource xr = testCollection.createResource("hamlet.xml", XMLResource.class); - try (final InputStream is = SAMPLES.getHamletSample()) { - xr.setContent(InputStreamUtil.readString(is, UTF_8)); - testCollection.storeResource(xr); - } + try (final Collection root = DatabaseManager.getCollection(getUri() + XmldbURI.ROOT_COLLECTION, "admin", null)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + + testCollection = service.createCollection("test"); + assertNotNull(testCollection); + + try (final Resource xr = testCollection.createResource("hamlet.xml", XMLResource.class); + final InputStream is = SAMPLES.getHamletSample()) { + xr.setContent(InputStreamUtil.readString(is, UTF_8)); + testCollection.storeResource(xr); + } - xmlrpcCollection = service.createCollection("xmlrpc"); - assertNotNull(xmlrpcCollection); + xmlrpcCollection = service.createCollection("xmlrpc"); + assertNotNull(xmlrpcCollection); - Resource br = xmlrpcCollection.createResource(TestConstants.TEST_MODULE_URI.toString(), BinaryResource.class); - ((EXistResource) br).setMediaType(MediaType.APPLICATION_XQUERY); - br.setContent(XmlRpcTest.MODULE_DATA); - xmlrpcCollection.storeResource(br); + try (final Resource br = xmlrpcCollection.createResource(TestConstants.TEST_MODULE_URI.toString(), BinaryResource.class)) { + ((EXistResource) br).setMediaType(MediaType.APPLICATION_XQUERY); + br.setContent(XmlRpcTest.MODULE_DATA); + xmlrpcCollection.storeResource(br); + } + } } @After public void tearDown() throws Exception { + xmlrpcCollection.close(); + testCollection.close(); + if (!((EXistCollection) testCollection).isRemoteCollection()) { - DatabaseInstanceManager dim = - testCollection.getService(DatabaseInstanceManager.class); + final DatabaseInstanceManager dim = testCollection.getService(DatabaseInstanceManager.class); dim.shutdown(); } + testCollection = null; xmlrpcCollection = null; } diff --git a/exist-core/src/test/java/org/exist/xmldb/RenameCollectionTest.java b/exist-core/src/test/java/org/exist/xmldb/RenameCollectionTest.java index 67c5388817..1ec9e4388b 100644 --- a/exist-core/src/test/java/org/exist/xmldb/RenameCollectionTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/RenameCollectionTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -81,26 +105,29 @@ public void rename_sameName() throws XMLDBException { * /db/testRename/0/3 */ EXistCollectionManagementService service = testCollection.getService(EXistCollectionManagementService.class); - final Collection zeroCollection = service.createCollection(ZERO_COLLECTION_NAME); - assertNotNull(zeroCollection); + try (final Collection zeroCollection = service.createCollection(ZERO_COLLECTION_NAME)) { + assertNotNull(zeroCollection); - final Collection oneCollection = service.createCollection(ONE_COLLECTION_NAME); - assertNotNull(oneCollection); + try (final Collection oneCollection = service.createCollection(ONE_COLLECTION_NAME)) { + assertNotNull(oneCollection); - service = zeroCollection.getService(EXistCollectionManagementService.class); - final Collection threeCollection = service.createCollection(THREE_COLLECTION_NAME); - assertNotNull(threeCollection); + service = zeroCollection.getService(EXistCollectionManagementService.class); + try (final Collection threeCollection = service.createCollection(THREE_COLLECTION_NAME)) { + assertNotNull(threeCollection); - // rename the collection /db/testRename/0 to /db/testRename/zero - service = testCollection.getService(EXistCollectionManagementService.class); + // rename the collection /db/testRename/0 to /db/testRename/zero + service = testCollection.getService(EXistCollectionManagementService.class); - try { - service.move(XmldbURI.create(ZERO_COLLECTION_NAME), null, XmldbURI.create(ZERO_COLLECTION_NAME)); + try { + service.move(XmldbURI.create(ZERO_COLLECTION_NAME), null, XmldbURI.create(ZERO_COLLECTION_NAME)); - fail("It should be impossible to rename a collection to the same name"); + fail("It should be impossible to rename a collection to the same name"); - } catch (final XMLDBException e) { - assertTrue(e.getMessage().indexOf("Cannot move collection to itself") > -1); + } catch (final XMLDBException e) { + assertTrue(e.getMessage().indexOf("Cannot move collection to itself") > -1); + } + } + } } } @@ -114,36 +141,44 @@ public void rename_differentName() throws XMLDBException { * /db/test/0/3 */ EXistCollectionManagementService service = testCollection.getService(EXistCollectionManagementService.class); - final Collection zeroCollection = service.createCollection(ZERO_COLLECTION_NAME); - assertNotNull(zeroCollection); + try (final Collection zeroCollection = service.createCollection(ZERO_COLLECTION_NAME)) { + assertNotNull(zeroCollection); - final Collection oneCollection = service.createCollection(ONE_COLLECTION_NAME); - assertNotNull(oneCollection); + try (final Collection oneCollection = service.createCollection(ONE_COLLECTION_NAME)) { + assertNotNull(oneCollection); - service = zeroCollection.getService(EXistCollectionManagementService.class); - final Collection threeCollection = service.createCollection(THREE_COLLECTION_NAME); - assertNotNull(threeCollection); + service = zeroCollection.getService(EXistCollectionManagementService.class); + try (final Collection threeCollection = service.createCollection(THREE_COLLECTION_NAME)) { + assertNotNull(threeCollection); - // rename the collection /db/test/0 to /db/test/zero - service = testCollection.getService(EXistCollectionManagementService.class); + // rename the collection /db/test/0 to /db/test/zero + service = testCollection.getService(EXistCollectionManagementService.class); - final XmldbURI newName = XmldbURI.create("zero"); - service.move(XmldbURI.create(ZERO_COLLECTION_NAME), null, newName); + final XmldbURI newName = XmldbURI.create("zero"); + service.move(XmldbURI.create(ZERO_COLLECTION_NAME), null, newName); + } + } + } } @Before public void setUp() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService service = root.getService(CollectionManagementService.class); - testCollection = service.createCollection(TEST_COLLECTION_NAME); - assertNotNull(testCollection); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + testCollection = service.createCollection(TEST_COLLECTION_NAME); + assertNotNull(testCollection); + } } @After public void tearDown() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService service = root.getService(CollectionManagementService.class); - service.removeCollection(TEST_COLLECTION_NAME); - testCollection = null; + if (testCollection != null) { + testCollection.close(); + testCollection = null; + } + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + service.removeCollection(TEST_COLLECTION_NAME); + } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/ResourceSetTest.java b/exist-core/src/test/java/org/exist/xmldb/ResourceSetTest.java index 921333b652..cc5d007588 100644 --- a/exist-core/src/test/java/org/exist/xmldb/ResourceSetTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/ResourceSetTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -23,9 +47,17 @@ import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.io.InputStreamUtil; -import org.junit.*; -import org.xmldb.api.base.*; -import org.xmldb.api.modules.*; +import org.junit.After; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; +import org.xmldb.api.modules.CollectionManagementService; +import org.xmldb.api.modules.XMLResource; +import org.xmldb.api.modules.XPathQueryService; import java.io.InputStream; @@ -49,23 +81,28 @@ public void setUp() throws Exception { assertNotNull(testCollection); try (final InputStream is = SAMPLES.getSample("shakespeare/shakes.xsl")) { - final Resource shakesRes = testCollection.createResource("shakes.xsl", XMLResource.class); - shakesRes.setContent(InputStreamUtil.readAll(is)); - testCollection.storeResource(shakesRes); + try (final Resource shakesRes = testCollection.createResource("shakes.xsl", XMLResource.class)) { + shakesRes.setContent(InputStreamUtil.readAll(is)); + testCollection.storeResource(shakesRes); + } } try (final InputStream is = SAMPLES.getHamletSample()) { - final Resource hamletRes = testCollection.createResource("hamlet.xml", XMLResource.class); - hamletRes.setContent(InputStreamUtil.readAll(is)); - testCollection.storeResource(hamletRes); + try (final Resource hamletRes = testCollection.createResource("hamlet.xml", XMLResource.class)) { + hamletRes.setContent(InputStreamUtil.readAll(is)); + testCollection.storeResource(hamletRes); + } } } @After public void tearDown() throws XMLDBException { //delete the test collection - final CollectionManagementService service = testCollection.getParentCollection().getService(CollectionManagementService.class); - service.removeCollection(TEST_COLLECTION); + testCollection.close(); + try (final Collection parent = testCollection.getParentCollection()) { + final CollectionManagementService service = parent.getService(CollectionManagementService.class); + service.removeCollection(TEST_COLLECTION); + } } @Ignore @@ -78,10 +115,10 @@ public void intersection1() throws XMLDBException { final XPathQueryService service = testCollection.getService(XPathQueryService.class); - final ResourceSet result1 = service.query(query1); - final ResourceSet result2 = service.query(query2); - - assertEquals("size of intersection of " + query1 + " and " + query2 + " yields ", expected, ResourceSetHelper.intersection(result1, result2).getSize()); + try (final EXistResourceSet result1 = (EXistResourceSet) service.query(query1); + final EXistResourceSet result2 = (EXistResourceSet) service.query(query2)) { + assertEquals("size of intersection of " + query1 + " and " + query2 + " yields ", expected, ResourceSetHelper.intersection(result1, result2).getSize()); + } } @Test @@ -93,9 +130,9 @@ public void intersection2() throws XMLDBException { final XPathQueryService service = testCollection.getService(XPathQueryService.class); - final ResourceSet result1 = service.query(query1); - final ResourceSet result2 = service.query(query2); - - assertEquals("size of intersection of " + query1 + " and " + query2 + " yields ", expected, ResourceSetHelper.intersection(result1, result2).getSize()); + try (final EXistResourceSet result1 = (EXistResourceSet) service.query(query1); + final EXistResourceSet result2 = (EXistResourceSet) service.query(query2)) { + assertEquals("size of intersection of " + query1 + " and " + query2 + " yields ", expected, ResourceSetHelper.intersection(result1, result2).getSize()); + } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/ResourceTest.java b/exist-core/src/test/java/org/exist/xmldb/ResourceTest.java index 959464d68e..13aea4ba4a 100644 --- a/exist-core/src/test/java/org/exist/xmldb/ResourceTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/ResourceTest.java @@ -81,7 +81,6 @@ import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; import org.xmldb.api.base.ResourceIterator; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; @@ -112,281 +111,278 @@ public static void releaseXmldbJoinTransactions() { @Test public void readNonExistingResource() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - assertNotNull(testCollection); - Resource nonExistent = testCollection.getResource("12345.xml"); - assertNull(nonExistent); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + assertNotNull(testCollection); + try (final Resource nonExistent = testCollection.getResource("12345.xml")) { + assertNull(nonExistent); + } + } } @Test - public void readResource() throws XMLDBException, IOException { - final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - assertNotNull(testCollection); - final List resources = testCollection.listResources(); - assertEquals(resources.size(), testCollection.getResourceCount()); - - final XMLResource doc = (XMLResource) testCollection.getResource(resources.get(0)); - assertNotNull(doc); - - try(final StringBuilderWriter sout = new StringBuilderWriter()) { - final Properties outputProperties = new Properties(); - outputProperties.put(OutputKeys.METHOD, "xml"); - outputProperties.put(OutputKeys.ENCODING, "ISO-8859-1"); - outputProperties.put(OutputKeys.INDENT, "yes"); - outputProperties.put(OutputKeys.OMIT_XML_DECLARATION, "no"); - - final ContentHandler xmlout = new SAXSerializer(sout, outputProperties); - doc.getContentAsSAX(xmlout); + public void readResource() throws XMLDBException { + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + assertNotNull(testCollection); + final List resources = testCollection.listResources(); + assertEquals(resources.size(), testCollection.getResourceCount()); + + try (final XMLResource doc = (XMLResource) testCollection.getResource(resources.get(0))) { + assertNotNull(doc); + + try (final StringBuilderWriter sout = new StringBuilderWriter()) { + final Properties outputProperties = new Properties(); + outputProperties.put(OutputKeys.METHOD, "xml"); + outputProperties.put(OutputKeys.ENCODING, "ISO-8859-1"); + outputProperties.put(OutputKeys.INDENT, "yes"); + outputProperties.put(OutputKeys.OMIT_XML_DECLARATION, "no"); + + final ContentHandler xmlout = new SAXSerializer(sout, outputProperties); + doc.getContentAsSAX(xmlout); + } + } } } @Test public void testRecursiveSerailization() throws XMLDBException { final String xmlDoc1 = "Title" - + "" - + "Paragraph2" - + ""; + + "" + + "Paragraph2" + + ""; final String xmlDoc2 = "Title2"; final String doc1Name = "recurseSer1.xml"; final String doc2Name = "recurseSer2.xml"; - final XMLResource resource1 = addResource(doc1Name, xmlDoc1); - final XMLResource resource2 = addResource(doc2Name, xmlDoc2); + try (final XMLResource resource1 = addResource(doc1Name, xmlDoc1); + final XMLResource resource2 = addResource(doc2Name, xmlDoc2); + final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { - final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - assertNotNull(testCollection); + assertNotNull(testCollection); - try(final StringBuilderWriter sout = new StringBuilderWriter()) { - final Properties outputProperties = new Properties(); - outputProperties.put(OutputKeys.METHOD, "xml"); - outputProperties.put(OutputKeys.ENCODING, "UTF-8"); - outputProperties.put(OutputKeys.INDENT, "no"); - outputProperties.put(OutputKeys.OMIT_XML_DECLARATION, "yes"); + try (final StringBuilderWriter sout = new StringBuilderWriter()) { + final Properties outputProperties = new Properties(); + outputProperties.put(OutputKeys.METHOD, "xml"); + outputProperties.put(OutputKeys.ENCODING, "UTF-8"); + outputProperties.put(OutputKeys.INDENT, "no"); + outputProperties.put(OutputKeys.OMIT_XML_DECLARATION, "yes"); - final ContentHandler importHandler = new ImportingContentHandler(sout, outputProperties); - resource1.getContentAsSAX(importHandler); + final ContentHandler importHandler = new ImportingContentHandler(sout, outputProperties); + resource1.getContentAsSAX(importHandler); - final String result = sout.toString(); - assertEquals( + final String result = sout.toString(); + assertEquals( "" + - "Title" + - "" + - "Title2" + - "" + - "Paragraph2" + - "" - , result.trim()); + "Title" + + "" + + "Title2" + + "" + + "Paragraph2" + + "" + , result.trim()); + } } } @Test public void readDOM() throws XMLDBException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - assertNotNull(testCollection); - - XMLResource doc = (XMLResource) testCollection.getResource("r_and_j.xml"); - assertNotNull(doc); - Node n = doc.getContentAsDOM(); - Element elem=null; - if (n instanceof Element) { - elem = (Element)n; - } else if (n instanceof Document) { - elem = ((Document)n).getDocumentElement(); - } - assertNotNull(elem); - assertEquals(elem.getNodeName(), "PLAY"); - NodeList children = elem.getChildNodes(); - Node node; - for(int i = 0; i < children.getLength(); i++) { - node = children.item(i); - assertNotNull(node); - node = node.getFirstChild(); - while(node != null) { - node = node.getNextSibling(); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + assertNotNull(testCollection); + + try (final XMLResource doc = (XMLResource) testCollection.getResource("r_and_j.xml")) { + assertNotNull(doc); + Node n = doc.getContentAsDOM(); + Element elem = null; + if (n instanceof Element) { + elem = (Element) n; + } else if (n instanceof Document) { + elem = ((Document) n).getDocumentElement(); + } + assertNotNull(elem); + assertEquals(elem.getNodeName(), "PLAY"); + NodeList children = elem.getChildNodes(); + Node node; + for (int i = 0; i < children.getLength(); i++) { + node = children.item(i); + assertNotNull(node); + node = node.getFirstChild(); + while (node != null) { + node = node.getNextSibling(); + } + } } } } @Test public void setContentAsSAX() throws SAXException, ParserConfigurationException, XMLDBException, IOException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - assertNotNull(testCollection); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + assertNotNull(testCollection); - XMLResource doc = testCollection.createResource("test.xml", XMLResource.class); - String xml = - "Title" + try (final XMLResource doc = testCollection.createResource("test.xml", XMLResource.class)) { + String xml = + "Title" + "Paragraph1" + "Paragraph2" + ""; - ContentHandler handler = doc.setContentAsSAX(); - SAXParserFactory saxFactory = ExistSAXParserFactory.getSAXParserFactory(); - saxFactory.setNamespaceAware(true); - saxFactory.setValidating(false); - SAXParser sax = saxFactory.newSAXParser(); - XMLReader reader = sax.getXMLReader(); - reader.setContentHandler(handler); - reader.parse(new InputSource(new StringReader(xml))); - testCollection.storeResource(doc); + ContentHandler handler = doc.setContentAsSAX(); + SAXParserFactory saxFactory = ExistSAXParserFactory.getSAXParserFactory(); + saxFactory.setNamespaceAware(true); + saxFactory.setValidating(false); + SAXParser sax = saxFactory.newSAXParser(); + XMLReader reader = sax.getXMLReader(); + reader.setContentHandler(handler); + reader.parse(new InputSource(new StringReader(xml))); + testCollection.storeResource(doc); + } + } } @Test public void setContentAsDOM() throws XMLDBException, ParserConfigurationException, SAXException, IOException { - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - assertNotNull(testCollection); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + assertNotNull(testCollection); - XMLResource doc = testCollection.createResource("dom.xml", XMLResource.class); - String xml = - "Title" + try (final XMLResource doc = testCollection.createResource("dom.xml", XMLResource.class)) { + String xml = + "Title" + "Paragraph1" + "Paragraph2" + ""; - DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = docFactory.newDocumentBuilder(); - Document dom = builder.parse(new InputSource(new StringReader(xml))); - doc.setContentAsDOM(dom.getDocumentElement()); - testCollection.storeResource(doc); + DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = docFactory.newDocumentBuilder(); + Document dom = builder.parse(new InputSource(new StringReader(xml))); + doc.setContentAsDOM(dom.getDocumentElement()); + testCollection.storeResource(doc); + } + } } @Test public void setContentAsSourceXml() throws XMLDBException { - final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - assertNotNull(testCollection); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + assertNotNull(testCollection); - final XMLResource doc = testCollection.createResource("source.xml", XMLResource.class); - final String xml = - "Title1" + try (final XMLResource doc = testCollection.createResource("source.xml", XMLResource.class)) { + final String xml = + "Title1" + "Paragraph3" + "Paragraph4" + ""; - - - doc.setContent(new StringInputSource(xml)); - testCollection.storeResource(doc); - - final XMLResource newDoc = (XMLResource) testCollection.getResource("source.xml"); - final String newDocXml = (String) newDoc.getContent(); - assertThat(newDocXml, hasXPath("/test/title/text()", equalTo("Title1"))); - assertThat(newDocXml, hasXPath("count(/test/para)", equalTo("2"))); - assertThat(newDocXml, hasXPath("/test/para[1]/text()", equalTo("Paragraph3"))); - assertThat(newDocXml, hasXPath("/test/para[2]/text()", equalTo("Paragraph4"))); + + + doc.setContent(new StringInputSource(xml)); + testCollection.storeResource(doc); + } + + try (final XMLResource newDoc = (XMLResource) testCollection.getResource("source.xml")) { + final String newDocXml = (String) newDoc.getContent(); + assertThat(newDocXml, hasXPath("/test/title/text()", equalTo("Title1"))); + assertThat(newDocXml, hasXPath("count(/test/para)", equalTo("2"))); + assertThat(newDocXml, hasXPath("/test/para[1]/text()", equalTo("Paragraph3"))); + assertThat(newDocXml, hasXPath("/test/para[2]/text()", equalTo("Paragraph4"))); + } + } } @Test public void setContentAsSourceBinary() throws XMLDBException { - final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - assertNotNull(testCollection); - - final BinaryResource doc = testCollection.createResource("source.bin", BinaryResource.class); final byte[] bin = "Stuff And Things".getBytes(UTF_8); - doc.setContent(new StringInputSource(bin)); - testCollection.storeResource(doc); + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + assertNotNull(testCollection); - final BinaryResource newDoc = (BinaryResource) testCollection.getResource("source.bin"); - final byte[] newDocBin = (byte[]) newDoc.getContent(); + try (final BinaryResource doc = testCollection.createResource("source.bin", BinaryResource.class)) { + doc.setContent(new StringInputSource(bin)); + testCollection.storeResource(doc); + } - assertArrayEquals(bin, newDocBin); + try (final BinaryResource newDoc = (BinaryResource) testCollection.getResource("source.bin")) { + final byte[] newDocBin = (byte[]) newDoc.getContent(); + assertArrayEquals(bin, newDocBin); + } + } } @Test public void queryRemoveResource() throws XMLDBException { - Resource resource = null; - - Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - assertNotNull(testCollection); - String resourceName = "QueryTestPerson.xml"; - String id = "test." + System.currentTimeMillis(); - String content = "Jason"; - resource = testCollection.createResource(resourceName, XMLResource.class); - resource.setContent(content); - testCollection.storeResource(resource); - - XPathQueryService service = testCollection.getService(XPathQueryService.class); - ResourceSet rs = service.query("/person[@id='" + id + "']"); - - for (ResourceIterator iterator = rs.getIterator(); iterator.hasMoreResources();) { - Resource r = iterator.nextResource(); - testCollection.removeResource(r); - resource = null; + try (final Collection testCollection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + assertNotNull(testCollection); + String resourceName = "QueryTestPerson.xml"; + String id = "test." + System.currentTimeMillis(); + String content = "Jason"; + + try (final Resource resource = testCollection.createResource(resourceName, XMLResource.class)) { + resource.setContent(content); + testCollection.storeResource(resource); + } + + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet rs = (EXistResourceSet) service.query("/person[@id='" + id + "']")) { + + for (final ResourceIterator iterator = rs.getIterator(); iterator.hasMoreResources(); ) { + try (final Resource r = iterator.nextResource()) { + testCollection.removeResource(r); + } + } + } } } @Test public void addRemove() throws XMLDBException { - final String resourceID = "addremove.xml"; - XMLResource created = addResource(resourceID, xmlForTest()); - assertNotNull(created); + try (final XMLResource created = addResource(resourceID, xmlForTest())) { + assertNotNull(created); + } + // need to test documents xml structure - XMLResource located = resourceForId(resourceID); - assertNotNull(located); - //assertEquals((String) created.getContent(), (String) located.getContent()); + try (final XMLResource located = resourceForId(resourceID)) { + assertNotNull(located); + //assertEquals((String) created.getContent(), (String) located.getContent()); + } removeDocument(resourceID); - XMLResource locatedAfterRemove = resourceForId(resourceID); - assertNull(locatedAfterRemove); + try (final XMLResource locatedAfterRemove = resourceForId(resourceID)) { + assertNull(locatedAfterRemove); + } } @Test public void addRemoveAddWithIds() throws XMLDBException { - final String resourceID = "removeWithIds;1.xml"; - - addResource(resourceID, ""); + try (final Resource resource = addResource(resourceID, "")) { + // needed to ensure that resource is closed + } removeDocument(resourceID); - addResource(resourceID, ""); + try (final Resource resource = addResource(resourceID, "")) { + // needed to ensure that resource is closed + } } - private void removeDocument(String id) throws XMLDBException { - - XMLResource resource = resourceForId(id); - - if (null != resource) { - Collection collection = null; - - try { - collection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - collection.removeResource(resource); - } finally { - closeCollection(collection); + private void removeDocument(final String id) throws XMLDBException { + try (final XMLResource resource = resourceForId(id)) { + if (resource != null) { + try (final Collection collection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + collection.removeResource(resource); + } } } } private XMLResource addResource(String id, String content) throws XMLDBException { - Collection collection = null; - XMLResource result = null; - - try { - collection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - result = collection.createResource(id, XMLResource.class); + try (final Collection collection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + final XMLResource result = collection.createResource(id, XMLResource.class); result.setContent(content); collection.storeResource(result); - } finally { - closeCollection(collection); - } - return result; - } - - private XMLResource resourceForId(String id) throws XMLDBException { - Collection collection = null; - XMLResource result = null; - - try { - collection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - result = (XMLResource) collection.getResource(id); - } finally { - closeCollection(collection); + return result; } - - return result; } - private void closeCollection(Collection collection) throws XMLDBException { - if(null != collection) { - collection.close(); + private XMLResource resourceForId(final String id) throws XMLDBException { + try (final Collection collection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + return (XMLResource) collection.getResource(id); } } @@ -401,28 +397,31 @@ private String xmlForTest() { public void setUp() throws XMLDBException, IOException { //create a test collection final CollectionManagementService cms = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - final Collection testCollection = cms.createCollection(TEST_COLLECTION); - final UserManagementService ums = testCollection.getService(UserManagementService.class); - // change ownership to guest - final Account guest = ums.getAccount(GUEST_DB_USER); - ums.chown(guest, guest.getPrimaryGroup()); - ums.chmod("rwxr-xr-x"); + try (final Collection testCollection = cms.createCollection(TEST_COLLECTION)) { + final UserManagementService ums = testCollection.getService(UserManagementService.class); + // change ownership to guest + final Account guest = ums.getAccount(GUEST_DB_USER); + ums.chown(guest, guest.getPrimaryGroup()); + ums.chmod("rwxr-xr-x"); + } //store sample files as guest - final Collection testCollectionAsGuest = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION); - for (final String sampleName : SAMPLES.getShakespeareXmlSampleNames()) { - final XMLResource res = testCollectionAsGuest.createResource(sampleName, XMLResource.class); - try (final InputStream is = SAMPLES.getShakespeareSample(sampleName)) { - res.setContent(InputStreamUtil.readString(is, UTF_8)); + try (final Collection testCollectionAsGuest = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + TEST_COLLECTION)) { + for (final String sampleName : SAMPLES.getShakespeareXmlSampleNames()) { + try (final XMLResource res = testCollectionAsGuest.createResource(sampleName, XMLResource.class)) { + try (final InputStream is = SAMPLES.getShakespeareSample(sampleName)) { + res.setContent(InputStreamUtil.readString(is, UTF_8)); + } + testCollectionAsGuest.storeResource(res); + } } - testCollectionAsGuest.storeResource(res); } } @After public void tearDown() throws XMLDBException { //delete the test collection - CollectionManagementService cms = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); + final CollectionManagementService cms = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); cms.removeCollection(TEST_COLLECTION); } @@ -458,8 +457,7 @@ public void startElement(final String uri, final String localName, final String } private void importDoc(final String href) throws SAXException { - try { - final XMLResource resource = resourceForId(href); + try (final XMLResource resource = resourceForId(href)) { resource.getContentAsSAX(new ImportingContentHandler(writer, outputProperties)); } catch (final XMLDBException e) { throw new SAXException(e); diff --git a/exist-core/src/test/java/org/exist/xmldb/SerializationTest.java b/exist-core/src/test/java/org/exist/xmldb/SerializationTest.java index 1d449b827b..373c9d764a 100644 --- a/exist-core/src/test/java/org/exist/xmldb/SerializationTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/SerializationTest.java @@ -58,7 +58,6 @@ import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -149,32 +148,36 @@ private final String getBaseUri() { @Test public void wrappedNsTest1() throws XMLDBException { final XQueryService service = testCollection.getService(XQueryService.class); - final ResourceSet result = service.query("declare namespace foo=\"http://foo.com\"; //foo:entry"); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("declare namespace foo=\"http://foo.com\"; //foo:entry")) { + assertEquals(2, result.getSize()); - final Resource resource = result.getMembersAsResource(); - assertXMLEquals(XML_EXPECTED1, resource); + try (final Resource resource = result.getMembersAsResource()) { + assertXMLEquals(XML_EXPECTED1, resource); + } + } } @Test public void wrappedNsTest2() throws XMLDBException { final XQueryService service = testCollection.getService(XQueryService.class); - final ResourceSet result = service.query( + try (final EXistResourceSet result = (EXistResourceSet) service.query( "declare variable $config := 123; " + "declare variable $serverConfig := 123; " + " " + "{($config,$serverConfig)} " + - ""); - assertEquals(1, result.getSize()); + "")) { + assertEquals(1, result.getSize()); - final Resource resource = result.getMembersAsResource(); - assertXMLEquals(XML_EXPECTED2, resource); + try (final Resource resource = result.getMembersAsResource()) { + assertXMLEquals(XML_EXPECTED2, resource); + } + } } @Test public void xqueryUpdateNsTest() throws XMLDBException { final XQueryService service = testCollection.getService(XQueryService.class); - final ResourceSet result = service.query( + try (final EXistResourceSet result = (EXistResourceSet) service.query( "xquery version \"1.0\";" + EOL + "declare namespace foo=\"http://foo.com\";" + EOL + "let $in-memory :=" + EOL + XML + EOL + @@ -186,28 +189,31 @@ public void xqueryUpdateNsTest() throws XMLDBException { " $in-memory," + EOL + " $on-disk" + EOL + " )" + EOL - ); + )) { - assertEquals(2, result.getSize()); + assertEquals(2, result.getSize()); - final Resource inMemoryResource = result.getResource(0); - assertXMLEquals(XML, inMemoryResource); + try (final Resource inMemoryResource = result.getResource(0)) { + assertXMLEquals(XML, inMemoryResource); + } - final Resource onDiskResource = result.getResource(1); - assertXMLEquals(XML_UPDATED_EXPECTED, onDiskResource); + try (final Resource onDiskResource = result.getResource(1)) { + assertXMLEquals(XML_UPDATED_EXPECTED, onDiskResource); + } + } } @Test public void getDocTypeDefault() throws XMLDBException { - final Resource res = testCollection.getResource(TEST_XML_DOC_WITH_DOCTYPE_URI.lastSegmentString()); - assertEquals(XML_WITH_DOCTYPE, res.getContent()); + try (final Resource res = testCollection.getResource(TEST_XML_DOC_WITH_DOCTYPE_URI.lastSegmentString())) { + assertEquals(XML_WITH_DOCTYPE, res.getContent()); + } } @Test public void getDocTypeNo() throws XMLDBException { final String prevOutputDocType = testCollection.getProperty(EXistOutputKeys.OUTPUT_DOCTYPE); - try { - final Resource res = testCollection.getResource(TEST_XML_DOC_WITH_DOCTYPE_URI.lastSegmentString()); + try (final Resource res = testCollection.getResource(TEST_XML_DOC_WITH_DOCTYPE_URI.lastSegmentString())) { testCollection.setProperty(EXistOutputKeys.OUTPUT_DOCTYPE, "no"); assertEquals("", res.getContent()); } finally { @@ -220,8 +226,7 @@ public void getDocTypeNo() throws XMLDBException { @Test public void getDocTypeYes() throws XMLDBException { final String prevOutputDocType = testCollection.getProperty(EXistOutputKeys.OUTPUT_DOCTYPE); - try { - final Resource res = testCollection.getResource(TEST_XML_DOC_WITH_DOCTYPE_URI.lastSegmentString()); + try (final Resource res = testCollection.getResource(TEST_XML_DOC_WITH_DOCTYPE_URI.lastSegmentString())) { testCollection.setProperty(EXistOutputKeys.OUTPUT_DOCTYPE, "yes"); assertEquals(XML_WITH_DOCTYPE, res.getContent()); } finally { @@ -233,15 +238,15 @@ public void getDocTypeYes() throws XMLDBException { @Test public void getXmlDeclDefault() throws XMLDBException { - final Resource res = testCollection.getResource(TEST_XML_DOC_WITH_XMLDECL_URI.lastSegmentString()); - assertEquals(XML_WITH_XMLDECL, res.getContent()); + try (final Resource res = testCollection.getResource(TEST_XML_DOC_WITH_XMLDECL_URI.lastSegmentString())) { + assertEquals(XML_WITH_XMLDECL, res.getContent()); + } } @Test public void getXmlDeclNo() throws XMLDBException { final String prevOmitOriginalXmlDecl = testCollection.getProperty(EXistOutputKeys.OMIT_ORIGINAL_XML_DECLARATION); - try { - final Resource res = testCollection.getResource(TEST_XML_DOC_WITH_XMLDECL_URI.lastSegmentString()); + try (final Resource res = testCollection.getResource(TEST_XML_DOC_WITH_XMLDECL_URI.lastSegmentString())) { testCollection.setProperty(EXistOutputKeys.OMIT_ORIGINAL_XML_DECLARATION, "no"); assertEquals(XML_WITH_XMLDECL, res.getContent()); } finally { @@ -254,8 +259,7 @@ public void getXmlDeclNo() throws XMLDBException { @Test public void getXmlDeclYes() throws XMLDBException { final String prevOmitOriginalXmlDecl = testCollection.getProperty(EXistOutputKeys.OMIT_ORIGINAL_XML_DECLARATION); - try { - final Resource res = testCollection.getResource(TEST_XML_DOC_WITH_XMLDECL_URI.lastSegmentString()); + try (final Resource res = testCollection.getResource(TEST_XML_DOC_WITH_XMLDECL_URI.lastSegmentString())) { testCollection.setProperty(EXistOutputKeys.OMIT_ORIGINAL_XML_DECLARATION, "yes"); assertEquals("", res.getContent()); } finally { @@ -270,11 +274,13 @@ public void testArray() throws XMLDBException { final String query = "array { \"value 1\", \"value 2\" }"; final XQueryService service = testCollection.getService(XQueryService.class); - final ResourceSet result = service.query(query); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); - final Resource resource = result.getResource(0); - assertEquals("[ \"value 1\", \"value 2\" ]", resource.getContent()); + try (final Resource resource = result.getResource(0)) { + assertEquals("[ \"value 1\", \"value 2\" ]", resource.getContent()); + } + } } @Test @@ -282,11 +288,13 @@ public void testMap() throws XMLDBException { final String query = "map { \"prop1\" : \"value 1\", \"prop2\" : \"value 2\" }"; final XQueryService service = testCollection.getService(XQueryService.class); - final ResourceSet result = service.query(query); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); - final Resource resource = result.getResource(0); - assertEquals("map {\"prop2\": \"value 2\", \"prop1\": \"value 1\"}", resource.getContent()); + try (final Resource resource = result.getResource(0)) { + assertEquals("map {\"prop2\": \"value 2\", \"prop1\": \"value 1\"}", resource.getContent()); + } + } } private static void assertXMLEquals(final String expected, final Resource actual) throws XMLDBException { @@ -302,29 +310,37 @@ private static void assertXMLEquals(final String expected, final Resource actual @Before public void setUp() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService service = root.getService(CollectionManagementService.class); - testCollection = service.createCollection(TEST_COLLECTION_NAME); - assertNotNull(testCollection); - - final XMLResource res = testCollection.createResource(XML_DOC_NAME, XMLResource.class); - res.setContent(XML); - testCollection.storeResource(res); - - final XMLResource res1 = testCollection.createResource(TEST_XML_DOC_WITH_DOCTYPE_URI.lastSegmentString(), XMLResource.class); - res1.setContent(XML_WITH_DOCTYPE); - testCollection.storeResource(res1); - - final XMLResource res2 = testCollection.createResource(TEST_XML_DOC_WITH_XMLDECL_URI.lastSegmentString(), XMLResource.class); - res2.setContent(XML_WITH_XMLDECL); - testCollection.storeResource(res2); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + testCollection = service.createCollection(TEST_COLLECTION_NAME); + assertNotNull(testCollection); + + try (final XMLResource res = testCollection.createResource(XML_DOC_NAME, XMLResource.class)) { + res.setContent(XML); + testCollection.storeResource(res); + } + + try (final XMLResource res1 = testCollection.createResource(TEST_XML_DOC_WITH_DOCTYPE_URI.lastSegmentString(), XMLResource.class)) { + res1.setContent(XML_WITH_DOCTYPE); + testCollection.storeResource(res1); + } + + try (final XMLResource res2 = testCollection.createResource(TEST_XML_DOC_WITH_XMLDECL_URI.lastSegmentString(), XMLResource.class)) { + res2.setContent(XML_WITH_XMLDECL); + testCollection.storeResource(res2); + } + } } @After public void tearDown() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService service = root.getService(CollectionManagementService.class); - service.removeCollection(TEST_COLLECTION_NAME); + testCollection.close(); + + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + service.removeCollection(TEST_COLLECTION_NAME); + } + testCollection = null; } } diff --git a/exist-core/src/test/java/org/exist/xmldb/ShutdownTest.java b/exist-core/src/test/java/org/exist/xmldb/ShutdownTest.java index e5ff0abd0d..3795fe9342 100644 --- a/exist-core/src/test/java/org/exist/xmldb/ShutdownTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/ShutdownTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -27,7 +51,6 @@ import org.junit.*; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import java.io.IOException; @@ -35,7 +58,6 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; import static org.exist.samples.Samples.SAMPLES; /** @@ -75,28 +97,26 @@ public class ShutdownTest { @Before public void setUp() throws XMLDBException, IOException { final Collection rootCol = existXmldbEmbeddedServer.getRoot(); - Collection testCol = rootCol.getChildCollection("C1"); - if(testCol == null) { - testCol = DBUtils.addCollection(rootCol, "C1"); - assertNotNull(testCol); - } + try (final Collection testCol = DBUtils.addCollection(rootCol, "C1")) { - try (final InputStream is = SAMPLES.getBiblioSample()) { - DBUtils.addXMLResource(rootCol, "biblio.rdf", InputStreamUtil.readString(is, UTF_8)); - } + try (final InputStream is = SAMPLES.getBiblioSample()) { + DBUtils.addXMLResource(rootCol, "biblio.rdf", InputStreamUtil.readString(is, UTF_8)); + } - // store the data files - final String xml = - "" + XML + ""; - DBUtils.addXMLResource(testCol, "R1.xml", xml); + // store the data files + final String xml = + "" + XML + ""; + DBUtils.addXMLResource(testCol, "R1.xml", xml); + } } @After public void tearDown() throws Exception { - Collection rootCol = existXmldbEmbeddedServer.getRoot(); + final Collection rootCol = existXmldbEmbeddedServer.getRoot(); DBUtils.removeCollection(rootCol, "C1"); - Resource res = rootCol.getResource("biblio.rdf"); - rootCol.removeResource(res); + try (final Resource res = rootCol.getResource("biblio.rdf")) { + rootCol.removeResource(res); + } } @Test @@ -106,17 +126,23 @@ public void shutdown() throws Exception { final Collection rootCol = existXmldbEmbeddedServer.getRoot(); // after restarting the db, we first try a bunch of queries - final Collection testCol = rootCol.getChildCollection("C1"); + try (final Collection testCol = rootCol.getChildCollection("C1")) { - ResourceSet result = DBUtils.query(testCol, TEST_QUERY1); - assertEquals(1, result.getSize()); - assertEquals("+49 69 888478", result.getResource(0).getContent()); + try (final EXistResourceSet result = DBUtils.query(testCol, TEST_QUERY1)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("+49 69 888478", resource.getContent()); + } + } - result = DBUtils.query(testCol, TEST_QUERY2); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = DBUtils.query(testCol, TEST_QUERY2)) { + assertEquals(1, result.getSize()); + } - result = DBUtils.query(testCol, TEST_QUERY3); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = DBUtils.query(testCol, TEST_QUERY3)) { + assertEquals(1, result.getSize()); + } + } } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/TreeLevelOrderTest.java b/exist-core/src/test/java/org/exist/xmldb/TreeLevelOrderTest.java index b72c883bf4..eb4d25ca7d 100644 --- a/exist-core/src/test/java/org/exist/xmldb/TreeLevelOrderTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/TreeLevelOrderTest.java @@ -51,12 +51,16 @@ import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; -import org.xmldb.api.base.*; import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import org.xmldb.api.base.CompiledExpression; +import org.xmldb.api.base.ResourceIterator; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XQueryService; +import javax.annotation.Nullable; + import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -102,24 +106,30 @@ public void treeLevelOrder() throws XMLDBException { store(DOC1, DOC1_NAME); // read document back from database - final Node doc = load(DOC1_NAME); - assertNotNull(doc); - assertTrue(doc instanceof Document); - - //get node using DOM - String strTo = null; - - final Element elem = ((Document) doc).getDocumentElement(); - final NodeList elemChildNodes = elem.getChildNodes(); - for (int r = 0; r < elemChildNodes.getLength(); r++) { - if (elemChildNodes.item(r).getLocalName().equals("to")) { - final Node to = elemChildNodes.item(r); - strTo = to.getTextContent(); - break; + try (final EXistResourceSet result = load(DOC1_NAME)) { + assertNotNull(result); + final ResourceIterator it = result.getIterator(); + try (final XMLResource resource = (XMLResource) it.nextResource()) { + final Node doc = resource.getContentAsDOM(); + assertNotNull(doc); + assertTrue(doc instanceof Document); + + //get node using DOM + String strTo = null; + + final Element elem = ((Document) doc).getDocumentElement(); + final NodeList elemChildNodes = elem.getChildNodes(); + for (int r = 0; r < elemChildNodes.getLength(); r++) { + if (elemChildNodes.item(r).getLocalName().equals("to")) { + final Node to = elemChildNodes.item(r); + strTo = to.getTextContent(); + break; + } + } + + assertNotNull(strTo); } } - - assertNotNull(strTo); } /** @@ -149,7 +159,7 @@ private void store(final String xml, final String document) throws XMLDBExceptio * * @param document the document to load */ - private Node load(final String document) throws XMLDBException { + private @Nullable EXistResourceSet load(final String document) throws XMLDBException { final StringBuilder query = new StringBuilder(); query.append("declare variable $document as xs:string external;"); query.append("let $survey := doc(string-join(('" + XmldbURI.ROOT_COLLECTION + "', $document), '/'))"); @@ -158,10 +168,6 @@ private Node load(final String document) throws XMLDBException { final XQueryService service = server.getRoot().getService(XQueryService.class); final CompiledExpression cQuery = service.compile(query.toString()); service.declareVariable("document", document); - final ResourceSet set = service.execute(cQuery); - if (set != null && set.getSize() > 0) { - return ((XMLResource) set.getIterator().nextResource()).getContentAsDOM(); - } - return null; + return (EXistResourceSet) service.execute(cQuery); } } diff --git a/exist-core/src/test/java/org/exist/xmldb/XMLDBExternalVariableTest.java b/exist-core/src/test/java/org/exist/xmldb/XMLDBExternalVariableTest.java index 496ccc7106..f88774f37e 100644 --- a/exist-core/src/test/java/org/exist/xmldb/XMLDBExternalVariableTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/XMLDBExternalVariableTest.java @@ -48,7 +48,6 @@ import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.CompiledExpression; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XQueryService; @@ -125,8 +124,7 @@ public void queryPostWithExternalVariableNotSupplied() throws XMLDBException { final CompiledExpression compiled = xqueryService.compile("declare variable $local:my-variable as xs:string* external;\n$local:my-variable"); - try { - xqueryService.execute(compiled); + try (final EXistResourceSet result = (EXistResourceSet) xqueryService.execute(compiled)) { fail("Expected XMLDBException with cause XPathException: XPDY0002 External variable local:other-variable is not declared in the XQuery"); } catch (final XMLDBException e) { final Throwable cause = e.getCause(); @@ -1667,11 +1665,10 @@ private void queryPostWithExternalVariable(@Nullable final ErrorCodes.ErrorCode private void queryPostWithExternalVariable(final Tuple2 expectedResponse, final ExternalVariableValueRep[] expectedResult, @Nullable final String xqExternalVariableType, final ExternalVariableValueRep... externalVariableSequence) throws XMLDBException { @Nullable final Object[] externalVariableValue = buildExternalVariableValue(externalVariableSequence); final String query = buildQueryExternalVariable(xqExternalVariableType); - final Either> response = doPostWithAuth(externalVariableValue, query); + final Either> response = doPostWithAuth(externalVariableValue, query); @Nullable final Collection dbCollection = response.map(r -> r._1).getOrElse((Collection) null); - @Nullable final ResourceSet actualResultSet = response.map(r -> r._2).getOrElse((ResourceSet) null); - try { + try (@Nullable final EXistResourceSet actualResultSet = response.map(r -> r._2).getOrElse((EXistResourceSet) null);) { if (expectedResponse._1 == null) { // We expect success assertTrue(response.isRight()); @@ -1718,13 +1715,6 @@ private void queryPostWithExternalVariable(final Tuple2> buildExistVariableResultSequence(fin return results; } - private Either> doPostWithAuth(@Nullable final Object[] externalVariableValue, final String query) throws XMLDBException { + private Either> doPostWithAuth(@Nullable final Object[] externalVariableValue, final String query) throws XMLDBException { // NOTE(AR) dbCollection will be closed either when XMLDBException is captured, or the ResourceSet is closed final Collection dbCollection = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); try { @@ -1872,7 +1862,7 @@ private Either> doPostWithAuth(@ final CompiledExpression compiled = xqueryService.compile(query); try { - return Either.Right(Tuple(dbCollection, xqueryService.execute(compiled))); + return Either.Right(Tuple(dbCollection, (EXistResourceSet) xqueryService.execute(compiled))); } catch (final XMLDBException e) { dbCollection.close(); return Either.Left(e); diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/AbstractConcurrentTest.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/AbstractConcurrentTest.java index a326227524..fd9efae714 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/AbstractConcurrentTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/AbstractConcurrentTest.java @@ -88,19 +88,18 @@ public abstract class AbstractConcurrentTest { public final void startupDb() throws Exception { final Collection rootCol = existXmldbEmbeddedServer.getRoot(); assertNotNull(rootCol); + final IndexQueryService idxConf = rootCol.getService(IndexQueryService.class); idxConf.configureCollection(COLLECTION_CONFIG); - testCol = rootCol.getChildCollection(getTestCollectionName()); - if (testCol != null) { - CollectionManagementService mgr = DBUtils.getCollectionManagementService(rootCol); - mgr.removeCollection(getTestCollectionName()); - } + testCol = DBUtils.addCollection(rootCol, getTestCollectionName()); assertNotNull(testCol); } @After public final void tearDownDb() throws XMLDBException { + testCol.close(); + final Collection rootCol = existXmldbEmbeddedServer.getRoot(); DBUtils.removeCollection(rootCol, getTestCollectionName()); diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/ComplexUpdateTest.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/ComplexUpdateTest.java index e81c1a575f..54a52fbf35 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/ComplexUpdateTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/ComplexUpdateTest.java @@ -63,10 +63,10 @@ public class ComplexUpdateTest extends AbstractConcurrentTest { @Before public void setUp() throws Exception { - final XMLResource res = getTestCollection().createResource("R01.xml", XMLResource.class); - res.setContent(XML); - getTestCollection().storeResource(res); - getTestCollection().close(); + try (final XMLResource res = getTestCollection().createResource("R01.xml", XMLResource.class)) { + res.setContent(XML); + getTestCollection().storeResource(res); + } } @Override diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/ConcurrentQueryUpdateTest.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/ConcurrentQueryUpdateTest.java index 186c2852d3..9e3537c2dc 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/ConcurrentQueryUpdateTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/ConcurrentQueryUpdateTest.java @@ -48,11 +48,11 @@ import java.util.Arrays; import java.util.List; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.XmldbURI; import org.exist.xmldb.concurrent.action.XQueryUpdateAction; import org.junit.Before; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XQueryService; @@ -64,20 +64,23 @@ public class ConcurrentQueryUpdateTest extends AbstractConcurrentTest { @Before public void setUp() throws Exception { final Collection col = getTestCollection(); - final XMLResource res = col.createResource("testappend.xml", XMLResource.class); - res.setContent(""); - col.storeResource(res); + try (final XMLResource res = col.createResource("testappend.xml", XMLResource.class)) { + res.setContent(""); + col.storeResource(res); + } } @Override public void assertAdditional() throws XMLDBException { final Collection col = getTestCollection(); final XQueryService service = col.getService(XQueryService.class); - final ResourceSet result = service.query("distinct-values(//node/@id)"); - assertEquals(41, result.getSize()); - for (int i = 0; i < result.getSize(); i++) { - final XMLResource next = (XMLResource) result.getResource(i); - next.getContent(); + try (final EXistResourceSet result = (EXistResourceSet) service.query("distinct-values(//node/@id)")) { + assertEquals(41, result.getSize()); + for (int i = 0; i < result.getSize(); i++) { + try (final XMLResource next = (XMLResource) result.getResource(i)) { + next.getContent(); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/ConcurrentResource2Test.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/ConcurrentResource2Test.java index e0c5109281..30f36a32b9 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/ConcurrentResource2Test.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/ConcurrentResource2Test.java @@ -81,8 +81,9 @@ public class ConcurrentResource2Test extends AbstractConcurrentTest { @Before public void setUp() throws Exception { - Collection c1 = DBUtils.addCollection(getTestCollection(), "C1-C2"); - assertNotNull(c1); + try (final Collection c1 = DBUtils.addCollection(getTestCollection(), "C1-C2")) { + assertNotNull(c1); + } } @Override diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/ConcurrentResourceTest.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/ConcurrentResourceTest.java index 302204de33..c6c80cbcc5 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/ConcurrentResourceTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/ConcurrentResourceTest.java @@ -65,9 +65,10 @@ public class ConcurrentResourceTest extends AbstractConcurrentTest { @Before public void setUp() throws Exception { - final Collection c1 = DBUtils.addCollection(getTestCollection(), "C1-C2"); - assertNotNull(c1); - DBUtils.addXMLResource(c1, "R1.xml", ReplaceResourceAction.XML); + try (final Collection c1 = DBUtils.addCollection(getTestCollection(), "C1-C2")) { + assertNotNull(c1); + DBUtils.addXMLResource(c1, "R1.xml", ReplaceResourceAction.XML); + } } @Override diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/DBUtils.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/DBUtils.java index 6544f4040c..b75c78c5b9 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/DBUtils.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/DBUtils.java @@ -52,9 +52,12 @@ import org.exist.source.Source; import org.exist.source.StringSource; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.EXistXQueryService; import org.xml.sax.InputSource; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.ErrorCodes; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XPathQueryService; @@ -134,38 +137,42 @@ public static void addXMLResource(final Collection col, final String resourceId, if (file == null || !Files.exists(file)) { throw new IllegalArgumentException("File does not exist: " + file); } - final XMLResource res = col.createResource(resourceId, XMLResource.class); - res.setContent(file); - col.storeResource(res); + + try (final XMLResource res = col.createResource(resourceId, XMLResource.class)) { + res.setContent(file); + col.storeResource(res); + } } public static void addXMLResource(final Collection col, final String resourceId, final String contents) throws XMLDBException { - final XMLResource res = col.createResource(resourceId, XMLResource.class); - res.setContent(contents); - col.storeResource(res); + try (final XMLResource res = col.createResource(resourceId, XMLResource.class)) { + res.setContent(contents); + col.storeResource(res); + } } public static void addXMLResource(final Collection col, final String resourceId, final InputSource source) throws XMLDBException { - final XMLResource res = col.createResource(resourceId, XMLResource.class); - res.setContent(source); - col.storeResource(res); + try (final XMLResource res = col.createResource(resourceId, XMLResource.class)) { + res.setContent(source); + col.storeResource(res); + } } - public static ResourceSet query(final Collection collection, final String xpath) + public static EXistResourceSet query(final Collection collection, final String xpath) throws XMLDBException { final XPathQueryService service = getQueryService(collection); - return service.query(xpath); + return (EXistResourceSet) service.query(xpath); } - public static ResourceSet queryResource(final Collection collection, final String resource, final String xpath) + public static EXistResourceSet queryResource(final Collection collection, final String resource, final String xpath) throws XMLDBException { final XPathQueryService service = getQueryService(collection); - return service.queryResource(resource, xpath); + return (EXistResourceSet) service.queryResource(resource, xpath); } - public static ResourceSet xquery(final Collection collection, final String xquery) + public static EXistResourceSet xquery(final Collection collection, final String xquery) throws XMLDBException { final EXistXQueryService service = getXQueryService(collection); final Source source = new StringSource(xquery); diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/DeadlockTest.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/DeadlockTest.java index 70978bede4..2cd9375987 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/DeadlockTest.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/DeadlockTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -73,12 +97,14 @@ public WriterThread(final int resources) { @Override public void run() { try { - final Collection collection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - for (int i = 0; i < resources; i++) { - final XMLResource document = collection.createResource(Thread.currentThread().getName() + "_" + i, XMLResource.class); - document.setContent(DOCUMENT_CONTENT); - LOG.debug("Storing document {}", document.getId()); - collection.storeResource(document); + try (final Collection collection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + for (int i = 0; i < resources; i++) { + try (final XMLResource document = collection.createResource(Thread.currentThread().getName() + "_" + i, XMLResource.class)) { + document.setContent(DOCUMENT_CONTENT); + LOG.debug("Storing document {}", document.getId()); + collection.storeResource(document); + } + } } } catch (final Exception e) { LOG.error(e.getMessage(), e); diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/AttributeUpdateAction.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/AttributeUpdateAction.java index 61131d6690..d655dee6c8 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/AttributeUpdateAction.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/AttributeUpdateAction.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -49,13 +73,14 @@ public AttributeUpdateAction(final String collectionPath, final String resourceN @Override public boolean execute() throws XMLDBException { - final Collection col = DatabaseManager.getCollection(collectionPath, "admin", ""); - final XUpdateQueryService service = col.getService(XUpdateQueryService.class); - final int attrSize = rand.nextInt(5); - for (int i = 0; i < 10; i++) { - final String xupdate = XUPDATE_START + xmlGenerator.generateText(attrSize) + XUPDATE_END; - long mods = service.update(xupdate); + try (final Collection col = DatabaseManager.getCollection(collectionPath, "admin", "")) { + final XUpdateQueryService service = col.getService(XUpdateQueryService.class); + final int attrSize = rand.nextInt(5); + for (int i = 0; i < 10; i++) { + final String xupdate = XUPDATE_START + xmlGenerator.generateText(attrSize) + XUPDATE_END; + long mods = service.update(xupdate); + } + return true; } - return true; } } diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/ComplexUpdateAction.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/ComplexUpdateAction.java index d7b0de6920..a0632c7e78 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/ComplexUpdateAction.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/ComplexUpdateAction.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -21,9 +45,10 @@ */ package org.exist.xmldb.concurrent.action; +import org.exist.xmldb.EXistResourceSet; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XPathQueryService; @@ -91,33 +116,42 @@ public ComplexUpdateAction(final String collectionPath, final String resourceNam @Override public boolean execute() throws XMLDBException { - final Collection col = DatabaseManager.getCollection(collectionPath, "admin", ""); - for(int i = 0; i < repeat; i++) { - query(col, i); - col.close(); - - update(col, sessionUpdate); - // The following update will fail - final String versionUpdate = - "" + - "" + (i + 1) + - ""; - update(col, versionUpdate); - update(col, statusUpdate); + try (final Collection col = DatabaseManager.getCollection(collectionPath, "admin", "")) { + for (int i = 0; i < repeat; i++) { + query(col, i); + col.close(); + + update(col, sessionUpdate); + // The following update will fail + final String versionUpdate = + "" + + "" + (i + 1) + + ""; + update(col, versionUpdate); + update(col, statusUpdate); + } } return true; } private void query(final Collection col, final int repeat) throws XMLDBException { final XPathQueryService service = col.getService(XPathQueryService.class); - ResourceSet r = service.query("//USER-SESSION-DATA"); - assertEquals(1, r.getSize()); - for(long i = 0; i < r.getSize(); i++) { - XMLResource res = (XMLResource)r.getResource(i); + + try (final EXistResourceSet r = (EXistResourceSet) service.query("//USER-SESSION-DATA")) { + assertEquals(1, r.getSize()); + for (long i = 0; i < r.getSize(); i++) { + try (final XMLResource res = (XMLResource) r.getResource(i)) { + // needed to ensure that res is closed. + } + } + } + + try (final EXistResourceSet r = (EXistResourceSet) service.query("string(//USER-SESSION-DATA[1]/@version)")) { + assertEquals(1, r.getSize()); + try (final Resource resource = r.getResource(0)) { + assertEquals(repeat, Integer.parseInt(resource.getContent().toString())); + } } - r = service.query("string(//USER-SESSION-DATA[1]/@version)"); - assertEquals(1, r.getSize()); - assertEquals(repeat, Integer.parseInt(r.getResource(0).getContent().toString())); } private void update(final Collection col, final String xupdate) throws XMLDBException { diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/CreateCollectionAction.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/CreateCollectionAction.java index bce6688273..222822c921 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/CreateCollectionAction.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/CreateCollectionAction.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -44,18 +68,20 @@ public CreateCollectionAction(final String collectionPath, final String resource @Override public boolean execute() throws XMLDBException, IOException { - final Collection col = DatabaseManager.getCollection(collectionPath, "admin", ""); - final Collection target = DBUtils.addCollection(col, "C" + ++collectionCnt); - addFiles(target); + try (final Collection col = DatabaseManager.getCollection(collectionPath, "admin", ""); + final Collection target = DBUtils.addCollection(col, "C" + ++collectionCnt)) { - final EXistCollectionManagementService mgt = col.getService(EXistCollectionManagementService.class); - final Collection copy = DBUtils.addCollection(col, "CC" + collectionCnt); - for (String resource : target.listResources()) { - mgt.copyResource(target.getName() + '/' + resource, - copy.getName(), null); - } + addFiles(target); - return true; + final EXistCollectionManagementService mgt = col.getService(EXistCollectionManagementService.class); + try (final Collection copy = DBUtils.addCollection(col, "CC" + collectionCnt)) { + for (final String resource : target.listResources()) { + mgt.copyResource(target.getName() + '/' + resource, copy.getName(), null); + } + } + + return true; + } } private void addFiles(final Collection col) throws XMLDBException, IOException { diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/MultiResourcesAction.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/MultiResourcesAction.java index f71f9bd134..c98bc6d906 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/MultiResourcesAction.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/MultiResourcesAction.java @@ -68,9 +68,10 @@ public MultiResourcesAction(final List> sources, fin @Override public boolean execute() throws XMLDBException, IOException { - final Collection col = DatabaseManager.getCollection(collectionPath, "admin", ""); - addFiles(col); - return true; + try (final Collection col = DatabaseManager.getCollection(collectionPath, "admin", "")) { + addFiles(col); + return true; + } } private void addFiles(final Collection col) throws XMLDBException { diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/RemoveAppendAction.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/RemoveAppendAction.java index a392d6bc10..d118cb2094 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/RemoveAppendAction.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/RemoveAppendAction.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -52,11 +76,12 @@ public RemoveAppendAction(final String collectionPath, final String resourceName @Override public boolean execute() throws XMLDBException, IOException { - final Collection col = DatabaseManager.getCollection(collectionPath, "admin", ""); - final XUpdateQueryService service = col.getService(XUpdateQueryService.class); - append(service); - remove(service); - return true; + try (final Collection col = DatabaseManager.getCollection(collectionPath, "admin", "")) { + final XUpdateQueryService service = col.getService(XUpdateQueryService.class); + append(service); + remove(service); + return true; + } } private void remove(final XUpdateQueryService service) throws XMLDBException { diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/ReplaceResourceAction.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/ReplaceResourceAction.java index cc7f0dec7a..12a386f661 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/ReplaceResourceAction.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/ReplaceResourceAction.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -21,10 +45,11 @@ */ package org.exist.xmldb.concurrent.action; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.concurrent.DBUtils; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import static org.junit.Assert.assertEquals; @@ -64,22 +89,29 @@ public ReplaceResourceAction(final String collectionPath, final String resourceN @Override public boolean execute() throws XMLDBException { - final Collection col = DatabaseManager.getCollection(collectionPath, "admin", ""); - final String xml = - "" + XML + ""; - - DBUtils.addXMLResource(col, resourceName, xml); - - ResourceSet result = DBUtils.queryResource(col, resourceName, TEST_QUERY1); - assertEquals(1, result.getSize()); - assertEquals("+49 69 888478", result.getResource(0).getContent()); - - result = DBUtils.queryResource(col, resourceName, TEST_QUERY2); - assertEquals(1, result.getSize()); - - result = DBUtils.queryResource(col, resourceName, TEST_QUERY3); - assertEquals(1, result.getSize()); + try (final Collection col = DatabaseManager.getCollection(collectionPath, "admin", "")) { + final String xml = + "" + XML + ""; + + DBUtils.addXMLResource(col, resourceName, xml); + + try (final EXistResourceSet result = DBUtils.queryResource(col, resourceName, TEST_QUERY1)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("+49 69 888478", resource.getContent()); + } + } + + try (final EXistResourceSet result = DBUtils.queryResource(col, resourceName, TEST_QUERY2)) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = DBUtils.queryResource(col, resourceName, TEST_QUERY3)) { + assertEquals(1, result.getSize()); + } + } + return true; } } diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/RetrieveResourceAction.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/RetrieveResourceAction.java index a44943b2e9..8d3ab1e66a 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/RetrieveResourceAction.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/RetrieveResourceAction.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -35,12 +59,13 @@ public RetrieveResourceAction(final String collectionPath, final String resource @Override public boolean execute() throws XMLDBException { - final Collection col = DatabaseManager.getCollection(collectionPath); - final XMLResource res = (XMLResource)col.getResource(resourceName); + try (final Collection col = DatabaseManager.getCollection(collectionPath); + final XMLResource res = (XMLResource)col.getResource(resourceName)) { - final DefaultHandler handler = new DefaultHandler(); - res.getContentAsSAX(handler); + final DefaultHandler handler = new DefaultHandler(); + res.getContentAsSAX(handler); - return true; + return true; + } } } \ No newline at end of file diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/TextUpdateAction.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/TextUpdateAction.java index 652ff1ab30..aec1c30b80 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/TextUpdateAction.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/TextUpdateAction.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -23,9 +47,10 @@ import java.util.Random; +import org.exist.xmldb.EXistResourceSet; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XPathQueryService; import org.xmldb.api.modules.XUpdateQueryService; @@ -71,31 +96,39 @@ public TextUpdateAction(final String collectionPath, final String resourceName) @Override public boolean execute() throws XMLDBException { - final Collection col = DatabaseManager.getCollection(collectionPath, "admin", ""); - final XUpdateQueryService service = col.getService(XUpdateQueryService.class); - - // append a new section - long mods = service.update(APPEND); - assertEquals(1, mods); - - // update paragraph content - String updateText = Integer.toString(rand.nextInt()) + " & " + Integer.toString(rand.nextInt()); - final String update = UPDATE_START + updateText + UPDATE_END; - mods = service.update(update); - - assertEquals(1, mods); - - // query for section - final XPathQueryService query = col.getService(XPathQueryService.class); - ResourceSet result = query.query("/article/section/para/text()"); - assertEquals(1, result.getSize()); - updateText = result.getResource(0).getContent().toString(); - result = query.query("/article/section/para[. = '" + updateText + "']"); - assertEquals(1, result.getSize()); - result.getResource(0).getContent(); - - mods = service.update(REMOVE); - assertEquals(1, mods); + try (final Collection col = DatabaseManager.getCollection(collectionPath, "admin", "")) { + final XUpdateQueryService service = col.getService(XUpdateQueryService.class); + + // append a new section + long mods = service.update(APPEND); + assertEquals(1, mods); + + // update paragraph content + String updateText = Integer.toString(rand.nextInt()) + " & " + Integer.toString(rand.nextInt()); + final String update = UPDATE_START + updateText + UPDATE_END; + mods = service.update(update); + + assertEquals(1, mods); + + // query for section + final XPathQueryService query = col.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) query.query("/article/section/para/text()")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + updateText = resource.getContent().toString(); + } + } + + try (final EXistResourceSet result = (EXistResourceSet) query.query("/article/section/para[. = '" + updateText + "']")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + resource.getContent(); + } + } + + mods = service.update(REMOVE); + assertEquals(1, mods); + } return true; } } diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/ValueAppendAction.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/ValueAppendAction.java index 3408bcce8c..b19974c959 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/ValueAppendAction.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/ValueAppendAction.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -21,9 +45,10 @@ */ package org.exist.xmldb.concurrent.action; +import org.exist.xmldb.EXistResourceSet; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XPathQueryService; import org.xmldb.api.modules.XUpdateQueryService; @@ -47,12 +72,13 @@ public ValueAppendAction(final String collectionPath, final String resourceName) @Override public boolean execute() throws XMLDBException { - final Collection col = DatabaseManager.getCollection(collectionPath, "admin", ""); - final XUpdateQueryService service = col.getService(XUpdateQueryService.class); - final XPathQueryService query = col.getService(XPathQueryService.class); - append(service); - query(query); - remove(service); + try (final Collection col = DatabaseManager.getCollection(collectionPath, "admin", "")) { + final XUpdateQueryService service = col.getService(XUpdateQueryService.class); + final XPathQueryService query = col.getService(XPathQueryService.class); + append(service); + query(query); + remove(service); + } return true; } @@ -79,10 +105,15 @@ private void append(final XUpdateQueryService service) throws XMLDBException { } private void query(final XPathQueryService service) throws XMLDBException { - ResourceSet result = service.queryResource(resourceName, "/items/item[value = 44.53]"); - assertEquals(1, result.getSize()); - result = service.queryResource(resourceName, "/items/item[@id=1]/name[.='abcdefg']/text()"); - assertEquals(1, result.getSize()); - assertEquals("abcdefg", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(resourceName, "/items/item[value = 44.53]")) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(resourceName, "/items/item[@id=1]/name[.='abcdefg']/text()")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("abcdefg", resource.getContent().toString()); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/XQueryAction.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/XQueryAction.java index 0715b639a4..01a0a99f83 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/XQueryAction.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/XQueryAction.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -21,13 +45,13 @@ */ package org.exist.xmldb.concurrent.action; -import org.exist.xmldb.EXistXPathQueryService; +import org.exist.xmldb.EXistResourceSet; import org.xml.sax.helpers.DefaultHandler; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; +import org.xmldb.api.modules.XPathQueryService; /** * @author wolf @@ -47,22 +71,25 @@ public XQueryAction(final String collectionPath, final String resourceName, fina public boolean execute() throws XMLDBException { final long start = System.currentTimeMillis(); - final Collection col = DatabaseManager.getCollection(collectionPath); - - final EXistXPathQueryService service = col.getService(EXistXPathQueryService.class); - + try (final Collection col = DatabaseManager.getCollection(collectionPath)) { + + final XPathQueryService service = col.getService(XPathQueryService.class); + // service.beginProtected(); - final ResourceSet result = service.query(xquery); - - final DefaultHandler handler = new DefaultHandler(); - for (int i = 0; i < result.getSize(); i++) { - final XMLResource next = (XMLResource) result.getResource(i); - next.getContentAsSAX(handler); - } + try (final EXistResourceSet result = (EXistResourceSet) service.query(xquery)) { + + final DefaultHandler handler = new DefaultHandler(); + for (int i = 0; i < result.getSize(); i++) { + try (final XMLResource next = (XMLResource) result.getResource(i)) { + next.getContentAsSAX(handler); + } + } // service.endProtected(); - - runningTime += (System.currentTimeMillis() - start); - called++; + } + + runningTime += (System.currentTimeMillis() - start); + called++; + } return true; } diff --git a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/XQueryUpdateAction.java b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/XQueryUpdateAction.java index 7c42aefd5a..c329943657 100644 --- a/exist-core/src/test/java/org/exist/xmldb/concurrent/action/XQueryUpdateAction.java +++ b/exist-core/src/test/java/org/exist/xmldb/concurrent/action/XQueryUpdateAction.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -48,10 +72,11 @@ public XQueryUpdateAction(final String collectionPath, final String resourceName @Override public boolean execute() throws XMLDBException { - final Collection col = DatabaseManager.getCollection(collectionPath, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final XQueryService service = col.getService(XQueryService.class); - - service.query(query); - return true; + try (final Collection col = DatabaseManager.getCollection(collectionPath, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final XQueryService service = col.getService(XQueryService.class); + + service.query(query); + return true; + } } } diff --git a/exist-core/src/test/java/org/exist/xmlrpc/MimeTypeTest.java b/exist-core/src/test/java/org/exist/xmlrpc/MimeTypeTest.java index 5337933816..e0c3fcf2b7 100644 --- a/exist-core/src/test/java/org/exist/xmlrpc/MimeTypeTest.java +++ b/exist-core/src/test/java/org/exist/xmlrpc/MimeTypeTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -61,16 +85,18 @@ public void testXMLMimeType() throws XMLDBException { // store an XML document without an .xml extension try(Collection collection = DatabaseManager.getCollection(getBaseUri() + "/db/" + COLLECTION_NAME, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)){ final Class xmlResourceType = XMLResource.class; - final XMLResource resource = (XMLResource)collection.createResource(DOCUMENT_NAME, xmlResourceType); - resource.setContent(XML_CONTENT); - collection.storeResource(resource); - assertEquals(ResourceType.XML_RESOURCE, resource.getResourceType()); + try (final XMLResource resource = (XMLResource)collection.createResource(DOCUMENT_NAME, xmlResourceType)) { + resource.setContent(XML_CONTENT); + collection.storeResource(resource); + assertEquals(ResourceType.XML_RESOURCE, resource.getResourceType()); + } } - + // retrieve the document and verify its resource type try(Collection collection = DatabaseManager.getCollection(getBaseUri() + "/db/" + COLLECTION_NAME, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)){ - Resource resource = collection.getResource(DOCUMENT_NAME); - assertEquals(ResourceType.XML_RESOURCE, resource.getResourceType()); + try (final Resource resource = collection.getResource(DOCUMENT_NAME)) { + assertEquals(ResourceType.XML_RESOURCE, resource.getResourceType()); + } } } @@ -81,21 +107,25 @@ public static void startServer() throws ClassNotFoundException, IllegalAccessExc Database database = (Database) cl.newInstance(); DatabaseManager.registerDatabase(database); - Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - - CollectionManagementService mgmt = root.getService(CollectionManagementService.class); - assertThatNoException().isThrownBy(() -> mgmt.createCollection(COLLECTION_NAME)); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + CollectionManagementService mgmt = root.getService(CollectionManagementService.class); + assertThatNoException().isThrownBy(() -> { + try (final Collection created = mgmt.createCollection(COLLECTION_NAME)) { } + }); + } } @AfterClass public static void stopServer() throws XMLDBException { - Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - CollectionManagementService mgmt = - root.getService(CollectionManagementService.class); - mgmt.removeCollection(COLLECTION_NAME); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + CollectionManagementService mgmt = + root.getService(CollectionManagementService.class); + mgmt.removeCollection(COLLECTION_NAME); + } - Collection config = DatabaseManager.getCollection(getBaseUri() + "/db/system/config/db", "admin", ""); - mgmt = config.getService(CollectionManagementService.class); - mgmt.removeCollection(COLLECTION_NAME); + try (final Collection config = DatabaseManager.getCollection(getBaseUri() + "/db/system/config/db", "admin", "")) { + CollectionManagementService mgmt = config.getService(CollectionManagementService.class); + mgmt.removeCollection(COLLECTION_NAME); + } } } diff --git a/exist-core/src/test/java/org/exist/xmlrpc/QuerySessionTest.java b/exist-core/src/test/java/org/exist/xmlrpc/QuerySessionTest.java index 5b56ef39dc..26bb3403b2 100755 --- a/exist-core/src/test/java/org/exist/xmlrpc/QuerySessionTest.java +++ b/exist-core/src/test/java/org/exist/xmlrpc/QuerySessionTest.java @@ -50,12 +50,17 @@ import org.exist.TestDataGenerator; import org.exist.TestUtils; import org.exist.test.ExistWebServer; -import org.junit.*; +import org.exist.xmldb.EXistResourceSet; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.xml.sax.SAXException; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XQueryService; @@ -129,32 +134,35 @@ private String getBaseUri() { private final static int DOC_COUNT = 100; - private Random random = new Random(); + private final Random random = new Random(); @Test public void manualRelease() throws XMLDBException { - Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/rpctest", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - XQueryService service = test.getService(XQueryService.class); - ResourceSet result = service.query("//chapter[@xml:id eq 'chapter1']"); - assertTrue(result.getSize() > 0); - - if (!"local".equals(apiName)) { - // clear should release the query result on the server - result.clear(); - - // As the result has been cleared already, we should get an exception below - try { - result.getMembersAsResource(); - fail("Expected XMLDBException from calling Resource#getMembersAsResource() after ResourceSet#clear() when using the Remote XML:DB API"); - } catch (final XMLDBException e) { - assertEquals("Failed to invoke method retrieveAllFirstChunk in class org.exist.xmlrpc.RpcConnection: result set unknown or timed out", e.getMessage()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/rpctest", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + + final XQueryService service = test.getService(XQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query("//chapter[@xml:id eq 'chapter1']")) { + assertTrue(result.getSize() > 0); + + if (!"local".equals(apiName)) { + // clear should release the query result on the server + result.clear(); + + // As the result has been cleared already, we should get an exception below + try { + result.getMembersAsResource(); + fail("Expected XMLDBException from calling Resource#getMembersAsResource() after ResourceSet#clear() when using the Remote XML:DB API"); + } catch (final XMLDBException e) { + assertEquals("Failed to invoke method retrieveAllFirstChunk in class org.exist.xmlrpc.RpcConnection: result set unknown or timed out", e.getMessage()); + } + } } } } @Test public void runTasks() { - ExecutorService executor = Executors.newFixedThreadPool(N_THREADS); + final ExecutorService executor = Executors.newFixedThreadPool(N_THREADS); for (int i = 0; i < 100; i++) { executor.submit(new QueryTask(QUERY)); } @@ -163,10 +171,10 @@ public void runTasks() { boolean terminated = false; try { terminated = executor.awaitTermination(60 * 60, TimeUnit.SECONDS); - } catch (InterruptedException e) { + } catch (final InterruptedException e) { Thread.currentThread().interrupt(); } - Assert.assertTrue(terminated); + assertTrue(terminated); } private class QueryTask implements Runnable { @@ -180,12 +188,14 @@ private QueryTask(String query) { @Override public void run() { try { - final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/rpctest", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final XQueryService service = test.getService(XQueryService.class); - final int n = random.nextInt(DOC_COUNT) + 1; - service.declareVariable("n", "chapter" + n); - final ResourceSet result = service.query(query); - assertEquals(1, result.getSize()); + try (final Collection test = DatabaseManager.getCollection(getBaseUri() + "/db/rpctest", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final XQueryService service = test.getService(XQueryService.class); + final int n = random.nextInt(DOC_COUNT) + 1; + service.declareVariable("n", "chapter" + n); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + } + } } catch (final XMLDBException e) { LOG.error(e.getMessage(), e); fail(e.getMessage()); @@ -197,24 +207,27 @@ public void run() { public void storeTestData() throws XMLDBException, SAXException { if (!storedTestData) { // NOTE(AR) we only need to store the test data once! - final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - - final CollectionManagementService mgmt = root.getService(CollectionManagementService.class); - final Collection test = mgmt.createCollection("rpctest"); - - final TestDataGenerator generator = new TestDataGenerator("xdb", DOC_COUNT); - try { - final Path[] files = generator.generate(test, generateXQ); - for (int i = 0; i < files.length; i++) { - final Resource resource = test.createResource(files[i].getFileName().toString(), XMLResource.class); - resource.setContent(files[i].toFile()); - test.storeResource(resource); + try (final Collection root = DatabaseManager.getCollection(getBaseUri() + "/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + + final CollectionManagementService mgmt = root.getService(CollectionManagementService.class); + try (final Collection test = mgmt.createCollection("rpctest")) { + + final TestDataGenerator generator = new TestDataGenerator("xdb", DOC_COUNT); + try { + final Path[] files = generator.generate(test, generateXQ); + for (int i = 0; i < files.length; i++) { + try (final Resource resource = test.createResource(files[i].getFileName().toString(), XMLResource.class)) { + resource.setContent(files[i].toFile()); + test.storeResource(resource); + } + } + } finally { + generator.releaseAll(); + } } - } finally { - generator.releaseAll(); - } - storedTestData = true; + storedTestData = true; + } } } } diff --git a/exist-core/src/test/java/org/exist/xquery/AbstractDescendantOrSelfNodeKindTest.java b/exist-core/src/test/java/org/exist/xquery/AbstractDescendantOrSelfNodeKindTest.java index bb0ba72745..e1c7912a31 100644 --- a/exist-core/src/test/java/org/exist/xquery/AbstractDescendantOrSelfNodeKindTest.java +++ b/exist-core/src/test/java/org/exist/xquery/AbstractDescendantOrSelfNodeKindTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,9 +46,10 @@ package org.exist.xquery; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import static org.junit.Assert.assertEquals; @@ -51,61 +76,85 @@ public abstract class AbstractDescendantOrSelfNodeKindTest { ""; - protected abstract ResourceSet executeQueryOnDoc(final String docQuery) throws XMLDBException; + protected abstract EXistResourceSet executeQueryOnDoc(final String docQuery) throws XMLDBException; @Test public void documentNodeCount() throws XMLDBException { - final ResourceSet result = executeQueryOnDoc("count($doc//document-node())"); - assertEquals(1, result.getSize()); - assertEquals(0, Integer.parseInt((String)result.getResource(0).getContent())); + try (final EXistResourceSet result = executeQueryOnDoc("count($doc//document-node())")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(0, Integer.parseInt((String) resource.getContent())); + } + } } @Test public void nodeCount() throws XMLDBException { - final ResourceSet result = executeQueryOnDoc("count($doc//node())"); - assertEquals(1, result.getSize()); - assertEquals(26, Integer.parseInt((String)result.getResource(0).getContent())); + try (final EXistResourceSet result = executeQueryOnDoc("count($doc//node())")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(26, Integer.parseInt((String) resource.getContent())); + } + } } @Test public void elementCount() throws XMLDBException { - final ResourceSet result = executeQueryOnDoc("count($doc//element())"); - assertEquals(1, result.getSize()); - assertEquals(8, Integer.parseInt((String)result.getResource(0).getContent())); + try (final EXistResourceSet result = executeQueryOnDoc("count($doc//element())")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(8, Integer.parseInt((String) resource.getContent())); + } + } } @Test public void textCount() throws XMLDBException { - final ResourceSet result = executeQueryOnDoc("count($doc//text())"); - assertEquals(1, result.getSize()); - assertEquals(16, Integer.parseInt((String)result.getResource(0).getContent())); + try (final EXistResourceSet result = executeQueryOnDoc("count($doc//text())")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(16, Integer.parseInt((String) resource.getContent())); + } + } } @Test public void attributeCount() throws XMLDBException { - final ResourceSet result = executeQueryOnDoc("count($doc//attribute())"); - assertEquals(1, result.getSize()); - assertEquals(4, Integer.parseInt((String)result.getResource(0).getContent())); + try (final EXistResourceSet result = executeQueryOnDoc("count($doc//attribute())")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(4, Integer.parseInt((String) resource.getContent())); + } + } } @Test public void commentCount() throws XMLDBException { - final ResourceSet result = executeQueryOnDoc("count($doc//comment())"); - assertEquals(1, result.getSize()); - assertEquals(1, Integer.parseInt((String)result.getResource(0).getContent())); + try (final EXistResourceSet result = executeQueryOnDoc("count($doc//comment())")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(1, Integer.parseInt((String) resource.getContent())); + } + } } @Test public void processingInstructionCount() throws XMLDBException { - final ResourceSet result = executeQueryOnDoc("count($doc//processing-instruction())"); - assertEquals(1, result.getSize()); - assertEquals(1, Integer.parseInt((String)result.getResource(0).getContent())); + try (final EXistResourceSet result = executeQueryOnDoc("count($doc//processing-instruction())")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(1, Integer.parseInt((String) resource.getContent())); + } + } } @Test public void qnameTest() throws XMLDBException { - final ResourceSet result = executeQueryOnDoc("name($doc//d/node())"); - assertEquals(1, result.getSize()); - assertEquals("", result.getResource(0).getContent()); + try (final EXistResourceSet result = executeQueryOnDoc("name($doc//d/node())")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent()); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/AnnotationsTest.java b/exist-core/src/test/java/org/exist/xquery/AnnotationsTest.java index c8369fe7fb..c622416f88 100644 --- a/exist-core/src/test/java/org/exist/xquery/AnnotationsTest.java +++ b/exist-core/src/test/java/org/exist/xquery/AnnotationsTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -27,6 +51,7 @@ import org.exist.security.PermissionDeniedException; import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.LockException; +import org.exist.xmldb.EXistResourceSet; import org.junit.AfterClass; import org.junit.BeforeClass; import static org.junit.Assert.*; @@ -36,7 +61,6 @@ import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XPathQueryService; @@ -51,8 +75,9 @@ public class AnnotationsTest { @BeforeClass public static void setUp() throws XMLDBException, ClassNotFoundException, InstantiationException, IllegalAccessException { CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - Collection testCollection = service.createCollection("test"); - assertNotNull(testCollection); + try (final Collection testCollection = service.createCollection("test")) { + assertNotNull(testCollection); + } } @AfterClass @@ -60,15 +85,9 @@ public static void tearDown() throws LockException, TriggerException, Permission // testCollection.removeResource( testCollection .getResource(file_name)); TestUtils.cleanupDB(); } - - private Collection getTestCollection() throws XMLDBException { - return DatabaseManager.getCollection("xmldb:exist:///db/test", "admin", ""); - } - @Test public void annotation() throws XMLDBException { - final String TEST_VALUE_CONSTANT = "hello world"; final String query = @@ -81,16 +100,17 @@ public void annotation() throws XMLDBException { + "local:hello()"; final XPathQueryService service = getQueryService(); - final ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - Resource res = result.getIterator().nextResource(); - assertEquals(TEST_VALUE_CONSTANT, res.getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + + try (final Resource res = result.getIterator().nextResource()) { + assertEquals(TEST_VALUE_CONSTANT, res.getContent()); + } + } } @Test public void annotationWithLiterals() throws XMLDBException { - final String TEST_VALUE_CONSTANT = "hello world"; final String query = @@ -103,16 +123,17 @@ public void annotationWithLiterals() throws XMLDBException { + "local:hello()"; final XPathQueryService service = getQueryService(); - final ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - Resource res = result.getIterator().nextResource(); - assertEquals(TEST_VALUE_CONSTANT, res.getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + + try (final Resource res = result.getIterator().nextResource()) { + assertEquals(TEST_VALUE_CONSTANT, res.getContent()); + } + } } @Test(expected = XMLDBException.class) public void annotationInXMLNamespaceFails() throws XMLDBException { - final String TEST_VALUE_CONSTANT = "hello world"; final String query = @@ -125,12 +146,13 @@ public void annotationInXMLNamespaceFails() throws XMLDBException { + "local:hello()"; final XPathQueryService service = getQueryService(); - service.query(query); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to ensure that result is closed + } } @Test(expected = XMLDBException.class) public void annotationInXMLSchemaNamespaceFails() throws XMLDBException { - final String TEST_VALUE_CONSTANT = "hello world"; final String query = @@ -143,12 +165,13 @@ public void annotationInXMLSchemaNamespaceFails() throws XMLDBException { + "local:hello()"; final XPathQueryService service = getQueryService(); - service.query(query); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to ensure that result is closed + } } @Test(expected = XMLDBException.class) public void annotationInXMLSchemaInstanceNamespaceFails() throws XMLDBException { - final String TEST_VALUE_CONSTANT = "hello world"; final String query = @@ -161,12 +184,13 @@ public void annotationInXMLSchemaInstanceNamespaceFails() throws XMLDBException + "local:hello()"; final XPathQueryService service = getQueryService(); - service.query(query); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to ensure that result is closed + } } @Test(expected = XMLDBException.class) public void annotationInXPathFunctionsNamespaceFails() throws XMLDBException { - final String TEST_VALUE_CONSTANT = "hello world"; final String query = @@ -179,12 +203,13 @@ public void annotationInXPathFunctionsNamespaceFails() throws XMLDBException { + "local:hello()"; final XPathQueryService service = getQueryService(); - service.query(query); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to ensure that result is closed + } } @Test(expected = XMLDBException.class) public void annotationInXPathFunctionsMathNamespaceFails() throws XMLDBException { - final String TEST_VALUE_CONSTANT = "hello world"; final String query = @@ -197,12 +222,13 @@ public void annotationInXPathFunctionsMathNamespaceFails() throws XMLDBException + "local:hello()"; final XPathQueryService service = getQueryService(); - service.query(query); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to ensure that result is closed + } } @Test(expected = XMLDBException.class) public void annotationInXQueryOptionsNamespaceFails() throws XMLDBException { - final String TEST_VALUE_CONSTANT = "hello world"; final String query = @@ -215,12 +241,15 @@ public void annotationInXQueryOptionsNamespaceFails() throws XMLDBException { + "local:hello()"; final XPathQueryService service = getQueryService(); - service.query(query); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to ensure that result is closed + } } private XPathQueryService getQueryService() throws XMLDBException { - Collection testCollection = getTestCollection(); - XPathQueryService service = testCollection.getService(XPathQueryService.class); - return service; + try (final Collection testCollection = DatabaseManager.getCollection("xmldb:exist:///db/test", "admin", "")) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + return service; + } } } \ No newline at end of file diff --git a/exist-core/src/test/java/org/exist/xquery/CleanupTest.java b/exist-core/src/test/java/org/exist/xquery/CleanupTest.java index 775341588f..9c786c2ad9 100644 --- a/exist-core/src/test/java/org/exist/xquery/CleanupTest.java +++ b/exist-core/src/test/java/org/exist/xquery/CleanupTest.java @@ -54,11 +54,18 @@ import org.exist.storage.DBBroker; import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.xmldb.EXistResource; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.EXistXQueryService; import org.exist.xquery.value.FunctionReference; import org.exist.xquery.value.Sequence; -import org.junit.*; -import org.xmldb.api.base.*; +import org.junit.After; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Test; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.CompiledExpression; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; import xyz.elemental.mediatype.MediaType; @@ -112,17 +119,18 @@ public class CleanupTest { @Before public void setup() throws XMLDBException { - final CollectionManagementService service = - existEmbeddedServer.getRoot().getService(CollectionManagementService.class); + final CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); collection = service.createCollection("test"); - final Resource doc = collection.createResource("test-module.xql", BinaryResource.class); - doc.setContent(TEST_MODULE); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - collection.storeResource(doc); + try (final Resource doc = collection.createResource("test-module.xql", BinaryResource.class)) { + doc.setContent(TEST_MODULE); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + collection.storeResource(doc); + } } @After public void tearDown() throws XMLDBException { + collection.close(); final CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); service.removeCollection("test"); @@ -151,16 +159,19 @@ public void resetStateOfModuleVars() throws XMLDBException, XPathException { var2.setContextDocSet(DocumentSet.EMPTY_DOCUMENT_SET); // execute query and check result - final ResourceSet result = service.execute(compiled); - assertEquals(result.getSize(), 1); - assertEquals(result.getResource(0).getContent(), "Hello world123"); - - Sequence[] args = calledFunc.getCurrentArguments(); - assertNull(args); - assertNull(calledFunc.getContextDocSet()); - assertNull(calledBody.getContextDocSet()); - assertNull(var1.getContextDocSet()); - assertNull(var2.getContextDocSet()); + try (final EXistResourceSet result = (EXistResourceSet) service.execute(compiled)) { + assertEquals(result.getSize(), 1); + try (final Resource resource = result.getResource(0)) { + assertEquals(resource.getContent(), "Hello world123"); + } + + final Sequence[] args = calledFunc.getCurrentArguments(); + assertNull(args); + assertNull(calledFunc.getContextDocSet()); + assertNull(calledBody.getContextDocSet()); + assertNull(var1.getContextDocSet()); + assertNull(var2.getContextDocSet()); + } } @Test @@ -189,12 +200,15 @@ public void preserveExternalVariable() throws XMLDBException, XPathException { final Module module = modules[0]; module.declareVariable(new QName("VAR", MODULE_NS, "t"), "TEST"); - final ResourceSet result = service.execute(compiled); - assertEquals(result.getSize(), 2); - assertEquals(result.getResource(1).getContent(), "TEST"); + try (final EXistResourceSet result = (EXistResourceSet) service.execute(compiled)) { + assertEquals(result.getSize(), 2); + try (final Resource resource = result.getResource(1)) { + assertEquals(resource.getContent(), "TEST"); + } - final Variable var = module.resolveVariable(new QName("VAR", MODULE_NS, "t")); - assertNull(var); + final Variable var = module.resolveVariable(new QName("VAR", MODULE_NS, "t")); + assertNull(var); + } } @Test @@ -209,10 +223,12 @@ public void resetStateofInternalModule() throws XMLDBException, XPathException { final InternalFunctionCall root = (InternalFunctionCall) ((PathExpr) compiled).getFirst(); final TestModule.TestFunction func = (TestModule.TestFunction) root.getFunction(); - final ResourceSet result = service.execute(compiled); - assertEquals(result.getSize(), 1); - assertEquals(result.getResource(0).getContent(), "TEST"); - assertFalse(func.dummyProperty); + try (final EXistResourceSet result = (EXistResourceSet) service.execute(compiled)) { + assertEquals(result.getSize(), 1); + try (final Resource resource = result.getResource(0)) { + assertEquals(resource.getContent(), "TEST"); + } + assertFalse(func.dummyProperty); + } } - } diff --git a/exist-core/src/test/java/org/exist/xquery/ConstructedNodesTest.java b/exist-core/src/test/java/org/exist/xquery/ConstructedNodesTest.java index c00da0b2cb..3717ba5db2 100644 --- a/exist-core/src/test/java/org/exist/xquery/ConstructedNodesTest.java +++ b/exist-core/src/test/java/org/exist/xquery/ConstructedNodesTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -25,10 +49,11 @@ import com.googlecode.junittoolbox.ParallelRunner; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XQueryService; @@ -74,15 +99,15 @@ public void iterateConstructNodes() throws XPathException, XMLDBException { "", "" }; - - ResourceSet result = existEmbeddedServer.executeQuery(xquery); - - assertEquals(expectedResults.length, result.getSize()); - for(int i = 0; i < result.getSize(); i++) - { - assertEquals(expectedResults[i], result.getResource(i).getContent()); - } + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(xquery)) { + assertEquals(expectedResults.length, result.getSize()); + for (int i = 0; i < result.getSize(); i++) { + try (final Resource resource = result.getResource(i)) { + assertEquals(expectedResults[i], resource.getContent()); + } + } + } } /*** @@ -108,15 +133,15 @@ public void constructedNodesSort() throws XMLDBException { "Vegetable", "Fruit" }; - - ResourceSet result = existEmbeddedServer.executeQuery(xquery); - - assertEquals(expectedResults.length, result.getSize()); - for(int i = 0; i < result.getSize(); i++) - { - assertEquals(expectedResults[i], result.getResource(i).getContent()); - } + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(xquery)) { + assertEquals(expectedResults.length, result.getSize()); + for (int i = 0; i < result.getSize(); i++) { + try (final Resource resource = result.getResource(i)) { + assertEquals(expectedResults[i], resource.getContent()); + } + } + } } /** @@ -141,15 +166,15 @@ public void constructedNodesPosition() throws XMLDBException { "Fruit", "Fruit" }; - - ResourceSet result = existEmbeddedServer.executeQuery(xquery); - - assertEquals(expectedResults.length, result.getSize()); - for(int i = 0; i < result.getSize(); i++) - { - assertEquals(expectedResults[i], result.getResource(i).getContent()); - } + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(xquery)) { + assertEquals(expectedResults.length, result.getSize()); + for (int i = 0; i < result.getSize(); i++) { + try (final Resource resource = result.getResource(i)) { + assertEquals(expectedResults[i], resource.getContent()); + } + } + } } /** @@ -159,31 +184,36 @@ public void constructedNodesPosition() throws XMLDBException { */ @Test public void constructedTextNodes() throws XMLDBException { - String xquery = + final String xquery = "declare variable $hello-text-first := { \"hello\" }world;\n" + "declare variable $hello-text-last := world{ \"hello\" };\n" + "($hello-text-first, $hello-text-last)"; - String expectedResults [] = { + final String expectedResults [] = { "helloworld", "worldhello" }; final XQueryService xpathQueryService = existEmbeddedServer.getRoot().getService(XQueryService.class); - String oki = xpathQueryService.getProperty(OutputKeys.INDENT); + final String oki = xpathQueryService.getProperty(OutputKeys.INDENT); xpathQueryService.setProperty(OutputKeys.INDENT, "no"); + try { - ResourceSet result = xpathQueryService.query(xquery); + try (final EXistResourceSet result = (EXistResourceSet) xpathQueryService.query(xquery)) { - assertEquals(expectedResults.length, result.getSize()); + assertEquals(expectedResults.length, result.getSize()); - for(int i = 0; i < result.getSize(); i++) - { - assertEquals(expectedResults[i], result.getResource(i).getContent()); - } + for (int i = 0; i < result.getSize(); i++) { + try (final Resource resource = result.getResource(i)) { + assertEquals(expectedResults[i], resource.getContent()); + } + } + } - // Restore indent property to ensure test atomicity - xpathQueryService.setProperty(OutputKeys.INDENT, oki); + } finally { + // Restore indent property to ensure test atomicity + xpathQueryService.setProperty(OutputKeys.INDENT, oki); + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/ConversionsTest.java b/exist-core/src/test/java/org/exist/xquery/ConversionsTest.java index 9ce19bd4c2..0ece34fa8a 100644 --- a/exist-core/src/test/java/org/exist/xquery/ConversionsTest.java +++ b/exist-core/src/test/java/org/exist/xquery/ConversionsTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,9 +46,10 @@ package org.exist.xquery; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import static org.junit.Assert.assertEquals; @@ -45,14 +70,17 @@ public void qname2string() throws XMLDBException { "for $b in $a \n" + "return \n" + "{string($b)}" ; - final ResourceSet result = existEmbeddedServer.executeQuery( query ); - /* which returns : - foo:bar - foo:john - foo:doe" - */ - final String r = (String) result.getResource(0).getContent(); - assertEquals( "foo:bar", r ); - assertEquals( "XQuery: " + query, 3, result.getSize() ); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + /* which returns : + foo:bar + foo:john + foo:doe" + */ + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("foo:bar", r); + assertEquals("XQuery: " + query, 3, result.getSize()); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/DeepEqualTest.java b/exist-core/src/test/java/org/exist/xquery/DeepEqualTest.java index c6ced6a502..9f870a996b 100644 --- a/exist-core/src/test/java/org/exist/xquery/DeepEqualTest.java +++ b/exist-core/src/test/java/org/exist/xquery/DeepEqualTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -23,11 +47,19 @@ import org.exist.TestUtils; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.XmldbURI; -import org.junit.*; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; -import org.xmldb.api.modules.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; +import org.xmldb.api.modules.CollectionManagementService; +import org.xmldb.api.modules.XMLResource; +import org.xmldb.api.modules.XPathQueryService; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -500,11 +532,18 @@ public void nsElements3() throws XMLDBException { @Test public void forLoop() throws XMLDBException { - ResourceSet rs = query.query("let $set := testtesttest, $test := test for $node in $set/* return deep-equal($node, $test)"); - assertEquals(3, rs.getSize()); - assertEquals("false", rs.getResource(0).getContent()); - assertEquals("true", rs.getResource(1).getContent()); - assertEquals("false", rs.getResource(2).getContent()); + try (final EXistResourceSet rs = (EXistResourceSet) query.query("let $set := testtesttest, $test := test for $node in $set/* return deep-equal($node, $test)")) { + assertEquals(3, rs.getSize()); + try (final Resource resource = rs.getResource(0)) { + assertEquals("false", resource.getContent()); + } + try (final Resource resource = rs.getResource(1)) { + assertEquals("true", resource.getContent()); + } + try (final Resource resource = rs.getResource(2)) { + assertEquals("false", resource.getContent()); + } + } } @Test @@ -543,16 +582,19 @@ public void fnDeepEqualEquivalentStringAndInt() throws XMLDBException { } private void assertQuery(boolean expected, String q) throws XMLDBException { - ResourceSet rs = query.query(q); - assertEquals(1, rs.getSize()); - assertEquals(Boolean.toString(expected), rs.getResource(0).getContent()); + try (final EXistResourceSet rs = (EXistResourceSet) query.query(q)) { + assertEquals(1, rs.getSize()); + try (final Resource resource = rs.getResource(0)) { + assertEquals(Boolean.toString(expected), resource.getContent()); + } + } } - private XMLResource createDocument(String name, String content) throws XMLDBException { - XMLResource res = c.createResource(name, XMLResource.class); - res.setContent(content); - c.storeResource(res); - return res; + private void createDocument(String name, String content) throws XMLDBException { + try (final XMLResource res = c.createResource(name, XMLResource.class)) { + res.setContent(content); + c.storeResource(res); + } } @ClassRule @@ -560,23 +602,31 @@ private XMLResource createDocument(String name, String content) throws XMLDBExce @BeforeClass public static void setupTestCollection() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService rootcms = root.getService(CollectionManagementService.class); - c = root.getChildCollection("test"); - if (c != null) { - rootcms.removeCollection("test"); + try (final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService rootcms = root.getService(CollectionManagementService.class); + + try (final Collection c = root.getChildCollection("test")) { + if (c != null) { + rootcms.removeCollection("test"); + } + } + + c = rootcms.createCollection("test"); + assertNotNull(c); + query = c.getService(XPathQueryService.class); } - c = rootcms.createCollection("test"); - assertNotNull(c); - query = c.getService(XPathQueryService.class); } @AfterClass public static void tearDown() throws XMLDBException { if (c != null) { - final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService rootcms = root.getService(CollectionManagementService.class); - rootcms.removeCollection("test"); + c.close(); + + try (final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService rootcms = root.getService(CollectionManagementService.class); + rootcms.removeCollection("test"); + } + query = null; c = null; } diff --git a/exist-core/src/test/java/org/exist/xquery/DocumentUpdateTest.java b/exist-core/src/test/java/org/exist/xquery/DocumentUpdateTest.java index 17534a21b3..5f9e619017 100644 --- a/exist-core/src/test/java/org/exist/xquery/DocumentUpdateTest.java +++ b/exist-core/src/test/java/org/exist/xquery/DocumentUpdateTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,12 +46,13 @@ package org.exist.xquery; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XQueryService; @@ -125,11 +150,17 @@ public void update() throws XMLDBException { "(: without the output on the next line, it works :) " + "xs:string($link) " + ")"; - XQueryService service = testCollection.getService(XQueryService.class); - ResourceSet r = service.query(query); - assertEquals(r.getSize(), 2); - assertEquals(r.getResource(0).getContent().toString(), "123"); - assertEquals(r.getResource(1).getContent().toString(), "123"); + + final XQueryService service = testCollection.getService(XQueryService.class); + try (final EXistResourceSet r = (EXistResourceSet) service.query(query)) { + assertEquals(r.getSize(), 2); + try (final Resource resource = r.getResource(0)) { + assertEquals(resource.getContent().toString(), "123"); + } + try (final Resource resource = r.getResource(1)) { + assertEquals(resource.getContent().toString(), "123"); + } + } } @Test @@ -151,23 +182,27 @@ public void updateAttribute() throws XMLDBException { } - private String execQuery(String query) throws XMLDBException { - XQueryService service = testCollection.getService(XQueryService.class); - ResourceSet result = service.query(query); - assertEquals(result.getSize(), 1); - return result.getResource(0).getContent().toString(); + private String execQuery(final String query) throws XMLDBException { + final XQueryService service = testCollection.getService(XQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(result.getSize(), 1); + try (final Resource resource = result.getResource(0)) { + return resource.getContent().toString(); + } + } } @Before public void setUp() throws ClassNotFoundException, IllegalAccessException, InstantiationException, XMLDBException { - CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); + final CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); testCollection = service.createCollection(TEST_COLLECTION_NAME); assertNotNull(testCollection); } @After public void tearDown() throws XMLDBException { - CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); + testCollection.close(); + final CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); service.removeCollection(TEST_COLLECTION_NAME); testCollection = null; } diff --git a/exist-core/src/test/java/org/exist/xquery/DuplicateAttributesTest.java b/exist-core/src/test/java/org/exist/xquery/DuplicateAttributesTest.java index ead782d2fb..b0b987bb31 100644 --- a/exist-core/src/test/java/org/exist/xquery/DuplicateAttributesTest.java +++ b/exist-core/src/test/java/org/exist/xquery/DuplicateAttributesTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -25,17 +49,16 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.runner.RunWith; import org.xmldb.api.base.Collection; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XQueryService; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; import static org.junit.Assert.assertEquals; import org.junit.BeforeClass; import org.junit.AfterClass; @@ -80,31 +103,31 @@ public class DuplicateAttributesTest { */ @Test (expected=XMLDBException.class) public void appendStoredAttrFail() throws XMLDBException { - XQueryService xqs = testCollection.getService(XQueryService.class); + final XQueryService xqs = testCollection.getService(XQueryService.class); String query = "let $a := \n" + "{doc(\"/db/test/stored1.xml\")//@attr}" + "return $a"; - xqs.query(query); + try (final EXistResourceSet result = (EXistResourceSet) xqs.query(query)) { + // needed to ensure that result is closed + } } /** * Add attribute to element which has no conflicting attributes. */ @Test - public void appendStoredAttrOK() { - try { - XQueryService xqs = testCollection.getService(XQueryService.class); - String query = - "let $a := \n" + - "{doc(\"/db/test/stored2.xml\")//@attr2}" + - "return $a"; - ResourceSet result = xqs.query(query); + public void appendStoredAttrOK() throws XMLDBException { + final XQueryService xqs = testCollection.getService(XQueryService.class); + final String query = + "let $a := \n" + + "{doc(\"/db/test/stored2.xml\")//@attr2}" + + "return $a"; + try (final EXistResourceSet result = (EXistResourceSet) xqs.query(query)) { assertEquals(1, result.getSize()); - assertEquals("", result.getResource(0).getContent()); - } catch (XMLDBException e) { - LOG.error(e.getMessage(), e); - fail(e.getMessage()); + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent()); + } } } @@ -114,13 +137,15 @@ public void appendStoredAttrOK() { */ @Test (expected=XMLDBException.class) public void appendConstrAttr() throws XMLDBException { - XQueryService xqs = testCollection.getService(XQueryService.class); - String query = + final XQueryService xqs = testCollection.getService(XQueryService.class); + final String query = "let $a := " + "let $b := \n" + " {$a//@attr}" + "return $a"; - xqs.query(query); + try (final EXistResourceSet result = (EXistResourceSet) xqs.query(query)) { + // needed to ensure that result is cloded + } } /** @@ -129,11 +154,14 @@ public void appendConstrAttr() throws XMLDBException { */ @Test (expected=XMLDBException.class) public void appendIdref() throws XMLDBException { - XQueryService xqs = testCollection.getService(XQueryService.class); - String query = + final XQueryService xqs = testCollection.getService(XQueryService.class); + final String query = "{fn:idref(('id1', 'id2'), doc('/db/test/docdtd.xml')/IDS)}"; - ResourceSet result = xqs.query(query); - result.getResource(0).getContent(); + try (final EXistResourceSet result = (EXistResourceSet) xqs.query(query)) { + try (final Resource resource = result.getResource(0)) { + resource.getContent(); + } + } } @BeforeClass @@ -142,21 +170,25 @@ public static void setup() throws XMLDBException { testCollection = service.createCollection("test"); assertNotNull(testCollection); - Resource resource = testCollection.createResource("stored1.xml", XMLResource.class); - resource.setContent(STORED_DOC1); - testCollection.storeResource(resource); + try (final Resource resource = testCollection.createResource("stored1.xml", XMLResource.class)) { + resource.setContent(STORED_DOC1); + testCollection.storeResource(resource); + } - resource = testCollection.createResource("stored2.xml", XMLResource.class); - resource.setContent(STORED_DOC2); - testCollection.storeResource(resource); + try (final Resource resource = testCollection.createResource("stored2.xml", XMLResource.class)) { + resource.setContent(STORED_DOC2); + testCollection.storeResource(resource); + } - resource = testCollection.createResource("docdtd.xml", XMLResource.class); - resource.setContent(DOC_WITH_DTD); - testCollection.storeResource(resource); + try (final Resource resource = testCollection.createResource("docdtd.xml", XMLResource.class)) { + resource.setContent(DOC_WITH_DTD); + testCollection.storeResource(resource); + } } @AfterClass public static void cleanup() throws XMLDBException { + testCollection.close(); final CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); service.removeCollection("test"); } diff --git a/exist-core/src/test/java/org/exist/xquery/EntitiesTest.java b/exist-core/src/test/java/org/exist/xquery/EntitiesTest.java index 6b2d9448d7..59653ceb32 100644 --- a/exist-core/src/test/java/org/exist/xquery/EntitiesTest.java +++ b/exist-core/src/test/java/org/exist/xquery/EntitiesTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,13 +46,15 @@ package org.exist.xquery; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; -import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XQueryService; import static org.junit.Assert.assertEquals; @@ -54,6 +80,8 @@ public void setUp() throws ClassNotFoundException, IllegalAccessException, Insta @After public void tearDown() throws Exception { + testCollection.close(); + final CollectionManagementService service = existEmbeddedServer.getRoot().getService( CollectionManagementService.class); @@ -65,8 +93,7 @@ public void tearDown() throws Exception { * @see #queryResource(XQueryService, String, String, int, String) */ @SuppressWarnings("unused") - private ResourceSet queryResource(XQueryService service, String resource, - String query, int expected) throws XMLDBException { + private EXistResourceSet queryResource(final XQueryService service, final String resource, final String query, final int expected) throws XMLDBException { return queryResource(service, resource, query, expected, null); } @@ -79,9 +106,8 @@ private ResourceSet queryResource(XQueryService service, String resource, * @return a ResourceSet, allowing to do more assertions if necessary. * @throws XMLDBException */ - private ResourceSet queryResource(XQueryService service, String resource, - String query, int expected, String message) throws XMLDBException { - ResourceSet result = service.queryResource(resource, query); + private EXistResourceSet queryResource(final XQueryService service, final String resource, final String query, final int expected, final String message) throws XMLDBException { + final EXistResourceSet result = (EXistResourceSet) service.queryResource(resource, query); if(message == null) { assertEquals(query, expected, result.getSize()); } else { @@ -91,9 +117,9 @@ private ResourceSet queryResource(XQueryService service, String resource, } /** For queries without associated data */ - private ResourceSet queryAndAssert(XQueryService service, String query, - int expected, String message) throws XMLDBException { - ResourceSet result = service.query(query); + private EXistResourceSet queryAndAssert(final String query, final int expected, final String message) throws XMLDBException { + final XQueryService xqueryService = testCollection.getService(XQueryService.class); + final EXistResourceSet result = (EXistResourceSet) xqueryService.query(query); if(message == null) { assertEquals(expected, result.getSize()); } else { @@ -101,39 +127,10 @@ private ResourceSet queryAndAssert(XQueryService service, String query, } return result; } - - /** For queries without associated data */ - private XQueryService getQueryService() throws XMLDBException { - XQueryService service = testCollection.getService(XQueryService.class); - return service; - } - - /** stores XML String and get Query Service - * @param documentName to be stored in the DB - * @param content to be stored in the DB - * @return the XQuery Service - * @throws XMLDBException - */ - @SuppressWarnings("unused") - private XQueryService storeXMLStringAndGetQueryService(String documentName, - String content) throws XMLDBException { - XMLResource doc = - testCollection.createResource( - documentName, XMLResource.class ); - doc.setContent(content); - testCollection.storeResource(doc); - XQueryService service = - testCollection.getService(XQueryService.class); - return service; - } @Test public void attributeConstructor() throws XMLDBException { - XQueryService service = getQueryService(); - @SuppressWarnings("unused") - ResourceSet result; - - result = queryAndAssert( service, + try (final EXistResourceSet result = queryAndAssert( "", - 1, null ); - // TODO: could check result - + 1, null )) { + // TODO: could check result + } } @Test public void stringConstructor() throws XMLDBException { - XQueryService service = getQueryService(); - @SuppressWarnings("unused") - ResourceSet result; - - result = queryAndAssert( service, "'&'",1,null); - result = queryAndAssert( service, "'<'",1,null); - result = queryAndAssert( service, "'>'",1,null); - result = queryAndAssert( service, "'''",1,null); - result = queryAndAssert( service, "'"'",1,null); - // TODO: could check result + try (final EXistResourceSet result = queryAndAssert("'&'", 1, null)) { + // TODO: could check result + } + + try (final EXistResourceSet result = queryAndAssert("'<'", 1, null)) { + // TODO: could check result + } + + try (final EXistResourceSet result = queryAndAssert("'>'", 1, null)) { + // TODO: could check result + } + + try (final EXistResourceSet result = queryAndAssert("'''", 1, null)) { + // TODO: could check result + } + + try (final EXistResourceSet result = queryAndAssert("'"'", 1, null)) { + // TODO: could check result + } } @Test public void uriConstructor() throws XMLDBException { - XQueryService service = getQueryService(); - ResourceSet result; - - result = queryAndAssert(service, "xs:anyURI(\"index.xql?a=1&b=2\")", 1, null); - // TODO: could check result + try (final EXistResourceSet result = queryAndAssert("xs:anyURI(\"index.xql?a=1&b=2\")", 1, null)) { + // TODO: could check result + } - result = queryAndAssert(service, "xs:anyURI('a') le xs:anyURI('b')", 1, null); - assertEquals("true",result.getResource(0).getContent()); + try (final EXistResourceSet result = queryAndAssert("xs:anyURI('a') le xs:anyURI('b')", 1, null)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("true", resource.getContent()); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/ImportFromPkgTest.java b/exist-core/src/test/java/org/exist/xquery/ImportFromPkgTest.java index 50125beb61..c7ecc1b7d1 100644 --- a/exist-core/src/test/java/org/exist/xquery/ImportFromPkgTest.java +++ b/exist-core/src/test/java/org/exist/xquery/ImportFromPkgTest.java @@ -21,10 +21,10 @@ package org.exist.xquery; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import java.io.File; @@ -64,12 +64,13 @@ public void printPackages() throws XMLDBException { expected.add("functx.xq"); expected.add("functx.xsl"); - final ResourceSet resultSet = existXmldbEmbeddedServer.executeQuery(query); - assertEquals(2, resultSet.getSize()); - final Set actual = new HashSet<>(); - actual.add(resultSet.getResource(0).getContent().toString()); - actual.add(resultSet.getResource(1).getContent().toString()); - assertEquals(expected, actual); + try (final EXistResourceSet resultSet = existXmldbEmbeddedServer.executeQuery(query)) { + assertEquals(2, resultSet.getSize()); + final Set actual = new HashSet<>(); + actual.add(resultSet.getResource(0).getContent().toString()); + actual.add(resultSet.getResource(1).getContent().toString()); + assertEquals(expected, actual); + } } @Test @@ -78,12 +79,13 @@ public void importFunctxNs() throws XMLDBException { "import module namespace functx = \"http://www.functx.com\";\n" + "\n" + "{functx:index-of-string('hello', 'll')}"; - final ResourceSet resultSet = existXmldbEmbeddedServer.executeQuery(query); - assertNotNull(resultSet); - assertEquals(1, resultSet.getSize()); - final Resource result = resultSet.getResource(0); - assertNotNull(result); - assertEquals("3", result.getContent().toString()); + try (final EXistResourceSet resultSet = existXmldbEmbeddedServer.executeQuery(query)) { + assertNotNull(resultSet); + assertEquals(1, resultSet.getSize()); + final Resource result = resultSet.getResource(0); + assertNotNull(result); + assertEquals("3", result.getContent().toString()); + } } @Test @@ -92,12 +94,13 @@ public void importFunctxLocationHintDb() throws XMLDBException { "import module namespace functx = \"http://www.functx.com\" at \"/db/system/repo/functx-1.0.1/functx/functx.xq\";\n" + "\n" + "{functx:index-of-string('hello', 'll')}"; - final ResourceSet resultSet = existXmldbEmbeddedServer.executeQuery(query); - assertNotNull(resultSet); - assertEquals(1, resultSet.getSize()); - final Resource result = resultSet.getResource(0); - assertNotNull(result); - assertEquals("3", result.getContent().toString()); + try (final EXistResourceSet resultSet = existXmldbEmbeddedServer.executeQuery(query)) { + assertNotNull(resultSet); + assertEquals(1, resultSet.getSize()); + final Resource result = resultSet.getResource(0); + assertNotNull(result); + assertEquals("3", result.getContent().toString()); + } } @Test @@ -106,22 +109,24 @@ public void importFunctxLocationHintXmldb() throws XMLDBException { "import module namespace functx = \"http://www.functx.com\" at \"xmldb:exist:///db/system/repo/functx-1.0.1/functx/functx.xq\";\n" + "\n" + "{functx:index-of-string('hello', 'll')}"; - final ResourceSet resultSet = existXmldbEmbeddedServer.executeQuery(query); - assertNotNull(resultSet); - assertEquals(1, resultSet.getSize()); - final Resource result = resultSet.getResource(0); - assertNotNull(result); - assertEquals("3", result.getContent().toString()); + try (final EXistResourceSet resultSet = existXmldbEmbeddedServer.executeQuery(query)) { + assertNotNull(resultSet); + assertEquals(1, resultSet.getSize()); + final Resource result = resultSet.getResource(0); + assertNotNull(result); + assertEquals("3", result.getContent().toString()); + } } @Test public void declareFunctx() { - try { - final String query = - "declare namespace functx = \"http://www.functx.com\";\n" + + final String query = + "declare namespace functx = \"http://www.functx.com\";\n" + "\n" + "{functx:index-of-string('hello', 'll')}"; - existXmldbEmbeddedServer.executeQuery(query); + + try (final EXistResourceSet resultSet = existXmldbEmbeddedServer.executeQuery(query)) { + // needed to close the resultSet } catch (final XMLDBException e) { assertTrue(e.getMessage().startsWith("err:XPST0017 Call to undeclared function: functx:index-of-string")); return; diff --git a/exist-core/src/test/java/org/exist/xquery/InternalModuleTest.java b/exist-core/src/test/java/org/exist/xquery/InternalModuleTest.java index b4e1c3b472..b777cd6c46 100644 --- a/exist-core/src/test/java/org/exist/xquery/InternalModuleTest.java +++ b/exist-core/src/test/java/org/exist/xquery/InternalModuleTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -19,19 +43,18 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - package org.exist.xquery; import org.exist.dom.QName; import org.exist.source.Source; import org.exist.source.StringSource; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.EXistXQueryService; import org.exist.xmldb.LocalXMLResource; import org.junit.Rule; import org.junit.Test; import org.w3c.dom.Node; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmlunit.builder.DiffBuilder; import org.xmlunit.builder.Input; @@ -109,25 +132,28 @@ public void requestResponseSessionVariables_4_x_x_Api() throws XMLDBException { } private void requestResponseSessionVariablesQuery_4_x_X_Api(final EXistXQueryService queryService, final Source query) throws XMLDBException { - final ResourceSet result = queryService.execute(query); // this variation of execute will use the XQueryPool for caching + // this variation of execute will use the XQueryPool for caching + try (final EXistResourceSet result = queryService.execute(query)) { - assertNotNull(result); - assertEquals(1, result.getSize()); + assertNotNull(result); + assertEquals(1, result.getSize()); - final LocalXMLResource resource = (LocalXMLResource)result.getResource(0); - assertNotNull(resource); + try (final LocalXMLResource resource = (LocalXMLResource) result.getResource(0)) { + assertNotNull(resource); - final Node actualDoc = resource.getContentAsDOM(); + final Node actualDoc = resource.getContentAsDOM(); - final javax.xml.transform.Source expected = Input.fromString("XPDY0002XPDY0002XPDY0002").build(); - final javax.xml.transform.Source actual = Input.fromNode(actualDoc).build(); + final javax.xml.transform.Source expected = Input.fromString("XPDY0002XPDY0002XPDY0002").build(); + final javax.xml.transform.Source actual = Input.fromNode(actualDoc).build(); - final Diff diff = DiffBuilder.compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); + final Diff diff = DiffBuilder.compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + assertFalse(diff.toString(), diff.hasDifferences()); + } + } } private static String getModuleVariableQuery(final String javaClass) { @@ -142,25 +168,27 @@ private static String getModuleVariableQuery(final String javaClass) { private void moduleVariablesQuery(final EXistXQueryService queryService, final Source query, final long expectedCount) throws XMLDBException { - final ResourceSet result = queryService.execute(query); // this variation of execute will use the XQueryPool for caching + // this variation of queryService#execute will use the XQueryPool for caching + try (final EXistResourceSet result = queryService.execute(query)) { + assertNotNull(result); + assertEquals(1, result.getSize()); - assertNotNull(result); - assertEquals(1, result.getSize()); + try (final LocalXMLResource resource = (LocalXMLResource) result.getResource(0)) { + assertNotNull(resource); - final LocalXMLResource resource = (LocalXMLResource)result.getResource(0); - assertNotNull(resource); + final Node actualDoc = resource.getContentAsDOM(); - final Node actualDoc = resource.getContentAsDOM(); + final javax.xml.transform.Source expected = Input.fromString("" + expectedCount + "").build(); + final javax.xml.transform.Source actual = Input.fromNode(actualDoc).build(); - final javax.xml.transform.Source expected = Input.fromString("" + expectedCount + "").build(); - final javax.xml.transform.Source actual = Input.fromNode(actualDoc).build(); + final Diff diff = DiffBuilder.compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); - final Diff diff = DiffBuilder.compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); - - assertFalse(diff.toString(), diff.hasDifferences()); + assertFalse(diff.toString(), diff.hasDifferences()); + } + } } public static class TestModuleWithVariables extends AbstractInternalModule { diff --git a/exist-core/src/test/java/org/exist/xquery/MemtreeDescendantOrSelfNodeKindTest.java b/exist-core/src/test/java/org/exist/xquery/MemtreeDescendantOrSelfNodeKindTest.java index ccb8830889..1b671000d6 100644 --- a/exist-core/src/test/java/org/exist/xquery/MemtreeDescendantOrSelfNodeKindTest.java +++ b/exist-core/src/test/java/org/exist/xquery/MemtreeDescendantOrSelfNodeKindTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,8 +46,8 @@ package org.exist.xquery; import com.googlecode.junittoolbox.ParallelRunner; +import org.exist.xmldb.EXistResourceSet; import org.junit.runner.RunWith; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; /** @@ -42,7 +66,7 @@ private String getInMemoryQuery(final String queryPostfix) { } @Override - protected ResourceSet executeQueryOnDoc(final String docQuery) throws XMLDBException { + protected EXistResourceSet executeQueryOnDoc(final String docQuery) throws XMLDBException { final String query = getInMemoryQuery(docQuery); return existEmbeddedServer.executeQuery(query); } diff --git a/exist-core/src/test/java/org/exist/xquery/NamespaceUpdateTest.java b/exist-core/src/test/java/org/exist/xquery/NamespaceUpdateTest.java index 55cd7fc1ca..93acc029dd 100644 --- a/exist-core/src/test/java/org/exist/xquery/NamespaceUpdateTest.java +++ b/exist-core/src/test/java/org/exist/xquery/NamespaceUpdateTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,12 +46,13 @@ package org.exist.xquery; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -53,7 +78,7 @@ public class NamespaceUpdateTest { @Test public void updateAttribute() throws XMLDBException { - XQueryService service = testCollection.getService(XQueryService.class); + final XQueryService service = testCollection.getService(XQueryService.class); String query = "declare namespace t='http://www.foo.com';\n" + "\n" + @@ -66,27 +91,32 @@ public void updateAttribute() throws XMLDBException { query = "declare namespace t='http://www.foo.com';\n" + "/t:test/@ID/string(.)"; - ResourceSet result = service.query(query); - assertEquals(1, result.getSize()); - assertEquals("myid", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("myid", resource.getContent().toString()); + } + } } @Before public void setUp() throws ClassNotFoundException, IllegalAccessException, InstantiationException, XMLDBException { // initialize driver final CollectionManagementService service = - existEmbeddedServer.getRoot().getService( - CollectionManagementService.class); + existEmbeddedServer.getRoot().getService( + CollectionManagementService.class); testCollection = service.createCollection("test"); assertNotNull(testCollection); - final XMLResource doc = testCollection.createResource("namespace-updates.xml", XMLResource.class); - doc.setContent(namespaces); - testCollection.storeResource(doc); + try (final XMLResource doc = testCollection.createResource("namespace-updates.xml", XMLResource.class)) { + doc.setContent(namespaces); + testCollection.storeResource(doc); + } } @After public void tearDown() throws Exception { + testCollection.close(); final CollectionManagementService service = existEmbeddedServer.getRoot().getService( CollectionManagementService.class); diff --git a/exist-core/src/test/java/org/exist/xquery/NodeTypeTest.java b/exist-core/src/test/java/org/exist/xquery/NodeTypeTest.java index 269ce273ff..4bbb1d60d7 100644 --- a/exist-core/src/test/java/org/exist/xquery/NodeTypeTest.java +++ b/exist-core/src/test/java/org/exist/xquery/NodeTypeTest.java @@ -47,12 +47,12 @@ import org.exist.TestUtils; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.XmldbURI; import org.junit.ClassRule; import org.junit.Test; -import org.w3c.dom.Node; -import org.xmldb.api.base.*; -import org.xmldb.api.modules.XMLResource; +import org.xmldb.api.base.CompiledExpression; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XQueryService; /** @@ -138,7 +138,9 @@ private void store(final String xml, final String document) throws XMLDBExceptio final CompiledExpression cQuery = service.compile(query.toString()); service.declareVariable("document", document); service.declareVariable("data", xml); - service.execute(cQuery); + try (final EXistResourceSet result = (EXistResourceSet) service.execute(cQuery)) { + // needed to ensure that result is closed + } } /** @@ -178,7 +180,9 @@ private void prepareWorkVersion() throws XMLDBException { final XQueryService service = server.getRoot().getService(XQueryService.class); final CompiledExpression cQuery = service.compile(query.toString()); service.declareVariable("collection", XmldbURI.ROOT_COLLECTION); - service.execute(cQuery); + try (final EXistResourceSet result = (EXistResourceSet) service.execute(cQuery)) { + // needed to ensure that result is closed + } } /** @@ -194,28 +198,8 @@ private void xupdateRemove(final String doc) throws XMLDBException { final XQueryService service = server.getRoot().getService(XQueryService.class); final CompiledExpression cQuery = service.compile(query.toString()); - service.execute(cQuery); - } - - /** - * Loads the xml document identified by document from the database. - * - * @param document the document to load - */ - @SuppressWarnings("unused") - private Node load(final String document) throws XMLDBException { - final StringBuilder query = new StringBuilder(); - query.append("declare variable $document as xs:string external;"); - query.append("let $result := doc(string-join(('" + XmldbURI.ROOT_COLLECTION + "', $document), '/'))"); - query.append("return ($result)"); - - final XQueryService service = server.getRoot().getService(XQueryService.class); - final CompiledExpression cQuery = service.compile(query.toString()); - service.declareVariable("document", document); - final ResourceSet set = service.execute(cQuery); - if (set != null && set.getSize() > 0) { - return ((XMLResource)set.getIterator().nextResource()).getContentAsDOM(); - } - return null; + try (final EXistResourceSet result = (EXistResourceSet) service.execute(cQuery)) { + // needed to ensure that result is closed + } } } \ No newline at end of file diff --git a/exist-core/src/test/java/org/exist/xquery/OptimizerTest.java b/exist-core/src/test/java/org/exist/xquery/OptimizerTest.java index 06befc68b0..a720e93ae8 100644 --- a/exist-core/src/test/java/org/exist/xquery/OptimizerTest.java +++ b/exist-core/src/test/java/org/exist/xquery/OptimizerTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -29,6 +53,7 @@ import org.exist.test.ExistEmbeddedServer; import org.exist.util.LockException; import org.exist.util.io.InputStreamUtil; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.IndexQueryService; import org.exist.xmldb.XmldbURI; import org.junit.*; @@ -36,7 +61,6 @@ import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Database; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -50,6 +74,7 @@ import static org.exist.util.PropertiesBuilder.propertiesBuilder; import static org.junit.Assert.assertEquals; import static org.exist.samples.Samples.SAMPLES; +import static org.junit.Assert.assertNotNull; /** * @@ -143,27 +168,29 @@ public void booleanOperator() throws XMLDBException { execute("//SPEECH[true() and true()]", true, MSG_OPT_ERROR, 2628); } - private long execute(String query, boolean optimize) throws XMLDBException { - XQueryService service = testCollection.getService(XQueryService.class); + private long execute(String query, final boolean optimize) throws XMLDBException { + final XQueryService service = testCollection.getService(XQueryService.class); if (optimize) { query = OPTIMIZE + query; } else { query = NO_OPTIMIZE + query; } query = NAMESPACES + query; - ResourceSet result = service.query(query); - return result.getSize(); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + return result.getSize(); + } } - private void execute(String query, boolean optimize, String message, long expected) throws XMLDBException { - XQueryService service = testCollection.getService(XQueryService.class); + private void execute(String query, final boolean optimize, final String message, final long expected) throws XMLDBException { + final XQueryService service = testCollection.getService(XQueryService.class); if (optimize) { query = NAMESPACES + OPTIMIZE + query; } else { query = NAMESPACES + NO_OPTIMIZE + query; } - ResourceSet result = service.query(query); - assertEquals(message, expected, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(message, expected, result.getSize()); + } } @ClassRule @@ -177,35 +204,37 @@ private void execute(String query, boolean optimize, String message, long expect @BeforeClass public static void initDatabase() throws ClassNotFoundException, IllegalAccessException, InstantiationException, XMLDBException, IOException, URISyntaxException { // initialize driver - Class cl = Class.forName("org.exist.xmldb.DatabaseImpl"); - Database database = (Database) cl.newInstance(); + final Class cl = Class.forName("org.exist.xmldb.DatabaseImpl"); + final Database database = (Database) cl.newInstance(); database.setProperty("create-database", "true"); DatabaseManager.registerDatabase(database); - Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", ""); - CollectionManagementService service = - root.getService(CollectionManagementService.class); - testCollection = service.createCollection("test"); - Assert.assertNotNull(testCollection); + try (final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", "")) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + testCollection = service.createCollection("test"); + assertNotNull(testCollection); - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); - idxConf.configureCollection(COLLECTION_CONFIG); + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + idxConf.configureCollection(COLLECTION_CONFIG); - XMLResource resource = testCollection.createResource("test.xml", XMLResource.class); - resource.setContent(XML); - testCollection.storeResource(resource); + try (final XMLResource resource = testCollection.createResource("test.xml", XMLResource.class)) { + resource.setContent(XML); + testCollection.storeResource(resource); + } - for (final String sampleName : SAMPLES.getShakespeareXmlSampleNames()) { - resource = testCollection.createResource(sampleName, XMLResource.class); - try (final InputStream is = SAMPLES.getShakespeareSample(sampleName)) { - resource.setContent(InputStreamUtil.readString(is, UTF_8)); + for (final String sampleName : SAMPLES.getShakespeareXmlSampleNames()) { + try (final XMLResource resource = testCollection.createResource(sampleName, XMLResource.class); + final InputStream is = SAMPLES.getShakespeareSample(sampleName)) { + resource.setContent(InputStreamUtil.readString(is, UTF_8)); + testCollection.storeResource(resource); + } } - testCollection.storeResource(resource); } } @AfterClass - public static void cleanupDb() throws LockException, TriggerException, PermissionDeniedException, EXistException, IOException { + public static void cleanupDb() throws LockException, TriggerException, PermissionDeniedException, EXistException, IOException, XMLDBException { + testCollection.close(); TestUtils.cleanupDB(); } } diff --git a/exist-core/src/test/java/org/exist/xquery/PersistentDescendantOrSelfNodeKindTest.java b/exist-core/src/test/java/org/exist/xquery/PersistentDescendantOrSelfNodeKindTest.java index 9623bacec9..b6c739b6b5 100644 --- a/exist-core/src/test/java/org/exist/xquery/PersistentDescendantOrSelfNodeKindTest.java +++ b/exist-core/src/test/java/org/exist/xquery/PersistentDescendantOrSelfNodeKindTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,12 +46,12 @@ package org.exist.xquery; import com.googlecode.junittoolbox.ParallelRunner; +import org.exist.xmldb.EXistResourceSet; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; @@ -46,22 +70,24 @@ private String getDbQuery(final String queryPostfix) { } @Override - protected ResourceSet executeQueryOnDoc(final String docQuery) throws XMLDBException { + protected EXistResourceSet executeQueryOnDoc(final String docQuery) throws XMLDBException { return existEmbeddedServer.executeQuery(getDbQuery(docQuery)); } @BeforeClass public static void storeTestDoc() throws XMLDBException { final Collection root = existEmbeddedServer.getRoot(); - final XMLResource res = root.createResource(TEST_DOCUMENT_NAME, XMLResource.class); - res.setContent(TEST_DOCUMENT); - root.storeResource(res); + try (final XMLResource res = root.createResource(TEST_DOCUMENT_NAME, XMLResource.class)) { + res.setContent(TEST_DOCUMENT); + root.storeResource(res); + } } @AfterClass public static void removeTestDoc() throws XMLDBException { final Collection root = existEmbeddedServer.getRoot(); - final Resource res = root.getResource(TEST_DOCUMENT_NAME); - root.removeResource(res); + try (final Resource res = root.getResource(TEST_DOCUMENT_NAME)) { + root.removeResource(res); + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/QueryPoolTest.java b/exist-core/src/test/java/org/exist/xquery/QueryPoolTest.java index 5b43ba260d..d2012ba430 100644 --- a/exist-core/src/test/java/org/exist/xquery/QueryPoolTest.java +++ b/exist-core/src/test/java/org/exist/xquery/QueryPoolTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -57,8 +81,9 @@ public void differentQueries() throws XMLDBException { @Test public void read() throws XMLDBException { - XMLResource res = (XMLResource) testCollection.getResource("large_list.xml"); - assertNotNull(res); + try (final XMLResource res = (XMLResource) testCollection.getResource("large_list.xml")) { + assertNotNull(res); + } } @Before @@ -69,9 +94,10 @@ public void setUp() throws ClassNotFoundException, IllegalAccessException, Insta testCollection = service.createCollection("test-pool"); assertNotNull(testCollection); - final XMLResource doc = testCollection.createResource("large_list.xml", XMLResource.class); - doc.setContent(""); - testCollection.storeResource(doc); + try (final XMLResource doc = testCollection.createResource("large_list.xml", XMLResource.class)) { + doc.setContent(""); + testCollection.storeResource(doc); + } } @After diff --git a/exist-core/src/test/java/org/exist/xquery/SeqOpTest.java b/exist-core/src/test/java/org/exist/xquery/SeqOpTest.java index dd2b458355..925aa8eb06 100644 --- a/exist-core/src/test/java/org/exist/xquery/SeqOpTest.java +++ b/exist-core/src/test/java/org/exist/xquery/SeqOpTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -27,11 +51,12 @@ import org.exist.TestUtils; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.XmldbURI; import org.junit.*; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -242,24 +267,29 @@ public void testInsertMixed2() throws XMLDBException { assertSeq(new String[]{"", "", "", "", "c"}, "insert-before((/top/x/*, 'c'), 2, /top/x/*)"); } - private void assertSeq(String[] expected, String q) throws XMLDBException { - ResourceSet rs = query.query(q); - assertEquals(expected.length, rs.getSize()); - List a = Arrays.asList(expected); - List r = new ArrayList<>((int) rs.getSize()); - for (int i = 0; i < rs.getSize(); i++) { - r.add(rs.getResource(i).getContent()); - } - if (!a.equals(r)) { - fail("expected " + a + ", got " + r); - } + private void assertSeq(final String[] expected, final String q) throws XMLDBException { + try (final EXistResourceSet rs = (EXistResourceSet) query.query(q)){ + assertEquals(expected.length, rs.getSize()); + + final List a = Arrays.asList(expected); + final List r = new ArrayList<>((int) rs.getSize()); + for (int i = 0; i < rs.getSize(); i++) { + try (final Resource resource = rs.getResource(i)) { + r.add(resource.getContent()); + } + } + + if (!a.equals(r)) { + fail("expected " + a + ", got " + r); + } + } } - private XMLResource createDocument(String name, String content) throws XMLDBException { - XMLResource res = c.createResource(name, XMLResource.class); - res.setContent(content); - c.storeResource(res); - return res; + private void createDocument(String name, String content) throws XMLDBException { + try (final XMLResource res = c.createResource(name, XMLResource.class)) { + res.setContent(content); + c.storeResource(res); + } } @ClassRule @@ -267,23 +297,26 @@ private XMLResource createDocument(String name, String content) throws XMLDBExce @BeforeClass public static void setupTestCollection() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService rootcms = root.getService(CollectionManagementService.class); - c = root.getChildCollection("test"); - if (c != null) { - rootcms.removeCollection("test"); + try (final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService rootcms = root.getService(CollectionManagementService.class); + c = root.getChildCollection("test"); + if (c != null) { + rootcms.removeCollection("test"); + } + c = rootcms.createCollection("test"); + assertNotNull(c); + query = c.getService(XPathQueryService.class); } - c = rootcms.createCollection("test"); - assertNotNull(c); - query = c.getService(XPathQueryService.class); } @AfterClass public static void tearDown() throws XMLDBException { if (c != null) { - final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final CollectionManagementService rootcms = root.getService(CollectionManagementService.class); - rootcms.removeCollection("test"); + c.close(); + try (final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final CollectionManagementService rootcms = root.getService(CollectionManagementService.class); + rootcms.removeCollection("test"); + } query = null; c = null; } diff --git a/exist-core/src/test/java/org/exist/xquery/SpecialNamesTest.java b/exist-core/src/test/java/org/exist/xquery/SpecialNamesTest.java index 21ab22807e..a18f94e976 100644 --- a/exist-core/src/test/java/org/exist/xquery/SpecialNamesTest.java +++ b/exist-core/src/test/java/org/exist/xquery/SpecialNamesTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,13 +46,14 @@ package org.exist.xquery; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; -import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XQueryService; import static org.junit.Assert.assertEquals; @@ -40,8 +65,6 @@ public class SpecialNamesTest { public static final ExistXmldbEmbeddedServer existEmbeddedServer = new ExistXmldbEmbeddedServer(false, true, true); private Collection testCollection; - @SuppressWarnings("unused") - private String query; @Before public void setUp() throws ClassNotFoundException, IllegalAccessException, InstantiationException, XMLDBException { @@ -54,6 +77,8 @@ public void setUp() throws ClassNotFoundException, IllegalAccessException, Insta @After public void tearDown() throws Exception { + testCollection.close(); + final CollectionManagementService service = existEmbeddedServer.getRoot().getService( CollectionManagementService.class); @@ -61,39 +86,10 @@ public void tearDown() throws Exception { testCollection = null; } - /** Helper that performs an XQuery and does JUnit assertion on result size. - * @see #queryResource(XQueryService, String, String, int, String) - */ - @SuppressWarnings("unused") - private ResourceSet queryResource(XQueryService service, String resource, - String query, int expected) throws XMLDBException { - return queryResource(service, resource, query, expected, null); - } - - /** Helper that performs an XQuery and does JUnit assertion on result size. - * @param service XQuery service - * @param resource database resource (collection) to query - * @param query - * @param expected size of result - * @param message for JUnit - * @return a ResourceSet, allowing to do more assertions if necessary. - * @throws XMLDBException - */ - private ResourceSet queryResource(XQueryService service, String resource, - String query, int expected, String message) throws XMLDBException { - ResourceSet result = service.queryResource(resource, query); - if(message == null) { - assertEquals(query, expected, result.getSize()); - } else { - assertEquals(message, expected, result.getSize()); - } - return result; - } - /** For queries without associated data */ - private ResourceSet queryAndAssert(XQueryService service, String query, - int expected, String message) throws XMLDBException { - ResourceSet result = service.query(query); + private EXistResourceSet queryAndAssert(final String query, final int expected, final String message) throws XMLDBException { + final XQueryService service = testCollection.getService(XQueryService.class); + final EXistResourceSet result = (EXistResourceSet) service.query(query); if (message == null) { assertEquals(expected, result.getSize()); } else { @@ -101,41 +97,11 @@ private ResourceSet queryAndAssert(XQueryService service, String query, } return result; } - - /** For queries without associated data */ - private XQueryService getQueryService() throws XMLDBException { - XQueryService service = testCollection.getService(XQueryService.class); - return service; - } - - /** stores XML String and get Query Service - * @param documentName to be stored in the DB - * @param content to be stored in the DB - * @return the XQuery Service - * @throws XMLDBException - */ - @SuppressWarnings("unused") - private XQueryService storeXMLStringAndGetQueryService(String documentName, - String content) throws XMLDBException { - XMLResource doc = - testCollection.createResource( - documentName, XMLResource.class ); - doc.setContent(content); - testCollection.storeResource(doc); - XQueryService service = - testCollection.getService(XQueryService.class); - return service; - } @Test public void attributes() throws XMLDBException { - XQueryService service = getQueryService(); - @SuppressWarnings("unused") - ResourceSet result; - - result = queryAndAssert( service, - "", - 1, null ); - // TODO: could check result + try (final EXistResourceSet result = queryAndAssert("", 1, null)) { + // TODO: could check result + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/StoredModuleTest.java b/exist-core/src/test/java/org/exist/xquery/StoredModuleTest.java index 426cd6f687..c925f2583a 100644 --- a/exist-core/src/test/java/org/exist/xquery/StoredModuleTest.java +++ b/exist-core/src/test/java/org/exist/xquery/StoredModuleTest.java @@ -46,6 +46,7 @@ package org.exist.xquery; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.rules.TemporaryFolder; import org.xmldb.api.base.Resource; @@ -59,7 +60,7 @@ import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.CompiledExpression; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.ResourceIterator; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; @@ -95,7 +96,7 @@ private Collection createCollection(String collectionName) throws XMLDBException final CollectionManagementService cmService = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); if (collection == null) { //cmService.removeCollection(collectionName); - cmService.createCollection(collectionName); + try (final Collection created = cmService.createCollection(collectionName)) { } } collection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + collectionName, "admin", ""); @@ -104,10 +105,11 @@ private Collection createCollection(String collectionName) throws XMLDBException } private void writeModule(Collection collection, String modulename, String module) throws XMLDBException { - BinaryResource res = collection.createResource(modulename, BinaryResource.class); - ((EXistResource) res).setMediaType(MediaType.APPLICATION_XQUERY); - res.setContent(module.getBytes()); - collection.storeResource(res); + try (final BinaryResource res = collection.createResource(modulename, BinaryResource.class)) { + ((EXistResource) res).setMediaType(MediaType.APPLICATION_XQUERY); + res.setContent(module.getBytes()); + collection.storeResource(res); + } collection.close(); } @@ -129,8 +131,11 @@ public void testQuery() throws Exception { CompiledExpression compiledQuery = xqService.compile(query); for (int i = 0; i < cols.length; i++) { xqService.declareVariable("itg-modules:coll", cols[i]); - ResourceSet result = xqService.execute(compiledQuery); - result.getResource(0).getContent(); + try (final EXistResourceSet result = (EXistResourceSet) xqService.execute(compiledQuery)) { + try (final Resource resource = result.getResource(0)) { + resource.getContent(); + } + } } } @@ -148,9 +153,12 @@ public void testModule1() throws Exception { Collection c = createCollection(collectionName); writeModule(c, "module1.xqm", module); - ResourceSet rs = existEmbeddedServer.executeQuery(query); - String r = (String) rs.getResource(0).getContent(); - assertEquals("hi from module 1", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("hi from module 1", r); + } + } } private static final String module2 = "module namespace mod2 = 'urn:module2'; " + @@ -205,9 +213,12 @@ public void testModule23_missingRelativeContext() throws XMLDBException { Collection c3 = createCollection(collection3Name); writeModule(c3, "module3.xqm", module3a); - ResourceSet rs = existEmbeddedServer.executeQuery(query); - String r = (String) rs.getResource(0).getContent(); - assertEquals("hi from module 3a", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("hi from module 3a", result); + } + } } @Test @@ -230,19 +241,25 @@ public void testRelativeImportDb() throws Exception { writeModule(c3, "module3.xqm", module3a); // test relative module import in subfolder - ResourceSet rs = existEmbeddedServer.executeQuery(query); - String r = (String) rs.getResource(0).getContent(); - assertEquals("hi from module 3a", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("hi from module 3a", r); + } + } // test relative module import in same folder, and using ".." writeModule(c2, "module2.xqm", module2b); - rs = existEmbeddedServer.executeQuery(query); - r = (String) rs.getResource(0).getContent(); - assertEquals("hi from module 4", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("hi from module 4", r); + } + } } - @Test + @Test public void testRelativeImportFile() throws Exception { final String collection2Name = "module2"; final String collection3Name = "module3"; @@ -266,16 +283,22 @@ public void testRelativeImportFile() throws Exception { writeFile(c3.resolve("module3.xqm"), module3a); // test relative module import in subfolder - ResourceSet rs = existEmbeddedServer.executeQuery(query); - String r = (String) rs.getResource(0).getContent(); - assertEquals("hi from module 3a", r); - + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("hi from module 3a", r); + } + } + // test relative module import in same folder, and using ".." writeFile(c2.resolve("module2.xqm"), module2b); - rs = existEmbeddedServer.executeQuery(query); - r = (String) rs.getResource(0).getContent(); - assertEquals("hi from module 4", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("hi from module 4", r); + } + } } @Test @@ -400,24 +423,27 @@ public void dyanmicModuleImport_for_same_namespace() throws XMLDBException { "import module namespace processor = \"http://processor\" at \"xmldb:exist://" + testHome.getName() + "/processor.xqm\";" + "\tprocessor:execute-module-function(xs:anyURI('http://moda'), xs:anyURI('" + testHome.getName() + "/module1.xqm'), 'hello')"; - final ResourceSet rs1 = existEmbeddedServer.executeQuery(query1); - - assertEquals(1, rs1.getSize()); - Resource r1 = rs1.getIterator().nextResource(); - assertEquals("module1", r1.getContent()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query1)) { + assertEquals(1, result.getSize()); + final ResourceIterator it = result.getIterator(); + try (final Resource r1 = it.nextResource()) { + assertEquals("module1", r1.getContent()); + } + } final String query2 = "xquery version \"1.0\";" + "import module namespace processor = \"http://processor\" at \"xmldb:exist://" + testHome.getName() + "/processor.xqm\";" + "\tprocessor:execute-module-function(xs:anyURI('http://moda'), xs:anyURI('" + testHome.getName() + "/module2.xqm'), 'hello')"; - - final ResourceSet rs2 = existEmbeddedServer.executeQuery(query2); - - assertEquals(1, rs2.getSize()); - Resource r2 = rs2.getIterator().nextResource(); - assertEquals("module2", r2.getContent()); - + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query2)) { + assertEquals(1, result.getSize()); + final ResourceIterator it = result.getIterator(); + try (final Resource r2 = it.nextResource()) { + assertEquals("module2", r2.getContent()); + } + } } private void writeFile(final Path path, final String module) throws IOException { diff --git a/exist-core/src/test/java/org/exist/xquery/TransformTest.java b/exist-core/src/test/java/org/exist/xquery/TransformTest.java index c92b0c2739..b3c7613844 100644 --- a/exist-core/src/test/java/org/exist/xquery/TransformTest.java +++ b/exist-core/src/test/java/org/exist/xquery/TransformTest.java @@ -47,6 +47,7 @@ import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.xmldb.EXistResource; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.XmldbURI; import org.junit.After; import org.junit.Before; @@ -55,7 +56,6 @@ import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -97,90 +97,90 @@ public void transform() throws XMLDBException { } - private String execQuery(String query) throws XMLDBException { - XQueryService service = testCollection.getService(XQueryService.class); + private String execQuery(final String query) throws XMLDBException { + final XQueryService service = testCollection.getService(XQueryService.class); service.setProperty("indent", "no"); - ResourceSet result = service.query(query); - assertEquals(result.getSize(), 1); - return result.getResource(0).getContent().toString(); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(result.getSize(), 1); + try (final Resource resource = result.getResource(0)) { + return resource.getContent().toString(); + } + } } - private void addXMLDocument(Collection c, String doc, String id) throws XMLDBException { - Resource r = c.createResource(id, XMLResource.class); - r.setContent(doc); - ((EXistResource) r).setMediaType(MediaType.APPLICATION_XML); - c.storeResource(r); + private void addXMLDocument(final Collection c, final String doc, final String id) throws XMLDBException { + try (final Resource r = c.createResource(id, XMLResource.class)) { + r.setContent(doc); + ((EXistResource) r).setMediaType(MediaType.APPLICATION_XML); + c.storeResource(r); + } } @Before public void setUp() throws ClassNotFoundException, IllegalAccessException, InstantiationException, XMLDBException { - CollectionManagementService service = - existEmbeddedServer.getRoot().getService( - CollectionManagementService.class); + CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); testCollection = service.createCollection(TEST_COLLECTION_NAME); assertNotNull(testCollection); - service = - testCollection.getService( - CollectionManagementService.class); - - Collection xsl1 = service.createCollection("xsl1"); - assertNotNull(xsl1); - - Collection xsl3 = service.createCollection("xsl3"); - assertNotNull(xsl3); - - service = - xsl1.getService( - CollectionManagementService.class); - - Collection xsl2 = service.createCollection("xsl2"); - assertNotNull(xsl2); - - - String doc1 = "\n" + - "\n"+ - "\n" + - "\n" + - "" + - "

Start Template 1

" + - "" + - "" + - "

End Template 1

" + - "
" + - "
" + - "
"; - - String doc2 = "\n" + - "\n"+ - "\n" + - "\n" + - "

Start Template 2

" + - "" + - "

End Template 2

" + - "
" + - "
"; - - String doc3 = "\n" + - "\n"+ - "\n" + - "

Template 3

" + - "
" + - "
"; - - addXMLDocument(xsl1, doc1, "1.xsl"); - addXMLDocument(xsl2, doc2, "2.xsl"); - addXMLDocument(xsl3, doc3, "3.xsl"); + service = testCollection.getService(CollectionManagementService.class); + + try (final Collection xsl1 = service.createCollection("xsl1")) { + assertNotNull(xsl1); + + + try (final Collection xsl3 = service.createCollection("xsl3")) { + assertNotNull(xsl3); + + service = xsl1.getService(CollectionManagementService.class); + + try (final Collection xsl2 = service.createCollection("xsl2")) { + assertNotNull(xsl2); + + final String doc1 = "\n" + + "\n" + + "\n" + + "\n" + + "" + + "

Start Template 1

" + + "" + + "" + + "

End Template 1

" + + "
" + + "
" + + "
"; + + final String doc2 = "\n" + + "\n" + + "\n" + + "\n" + + "

Start Template 2

" + + "" + + "

End Template 2

" + + "
" + + "
"; + + final String doc3 = "\n" + + "\n" + + "\n" + + "

Template 3

" + + "
" + + "
"; + + addXMLDocument(xsl1, doc1, "1.xsl"); + addXMLDocument(xsl2, doc2, "2.xsl"); + addXMLDocument(xsl3, doc3, "3.xsl"); + } + } + } } @After public void tearDown() throws XMLDBException { - Collection root = - DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", ""); - CollectionManagementService service = - root.getService( - CollectionManagementService.class); - service.removeCollection(TEST_COLLECTION_NAME); + testCollection.close(); + try (final Collection root = DatabaseManager.getCollection(XmldbURI.LOCAL_DB, "admin", "")) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + service.removeCollection(TEST_COLLECTION_NAME); + } testCollection = null; } } diff --git a/exist-core/src/test/java/org/exist/xquery/UnionTest.java b/exist-core/src/test/java/org/exist/xquery/UnionTest.java index a7bd1b79df..0173a02b67 100644 --- a/exist-core/src/test/java/org/exist/xquery/UnionTest.java +++ b/exist-core/src/test/java/org/exist/xquery/UnionTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,6 +46,7 @@ package org.exist.xquery; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; import static org.exist.collections.CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE; @@ -29,14 +54,11 @@ import static org.junit.Assert.assertNotNull; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XQueryService; - - /** * * @author Adam Retter @@ -91,9 +113,9 @@ public class UnionTest { @Test public void unionInPredicate_withoutIndex() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService(PUBMED_DOC_NAME, PUBMED); - final ResourceSet result = service.queryResource(PUBMED_DOC_NAME, XQUERY); - - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(PUBMED_DOC_NAME, XQUERY)) { + assertEquals(1, result.getSize()); + } } @Test @@ -101,9 +123,9 @@ public void unionInPredicate_withIndex() throws XMLDBException { storeCollectionConfig(); final XQueryService service = storeXMLStringAndGetQueryService(PUBMED_DOC_NAME, PUBMED); - final ResourceSet result = service.queryResource(PUBMED_DOC_NAME, XQUERY); - - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(PUBMED_DOC_NAME, XQUERY)) { + assertEquals(1, result.getSize()); + } } @Test @@ -111,16 +133,17 @@ public void unionPersistentAndConstructedNodes() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService(PUBMED_DOC_NAME, PUBMED); final String xquery = "doc('" + testCollection.getName() + "/" + PUBMED_DOC_NAME + "')//Language | | "; - final ResourceSet results = service.query(xquery); - assertEquals(3, results.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xquery)) { + assertEquals(3, result.getSize()); + } } private void storeCollectionConfig() throws XMLDBException { - - final Collection colConfig = getOrCreateCollection("/db/system/config/db/" + TEST_COLLECTION_NAME); - final XMLResource docConfig = colConfig.createResource(DEFAULT_COLLECTION_CONFIG_FILE, XMLResource.class); - docConfig.setContent(INDEX_CONFIG); - colConfig.storeResource(docConfig); + try (final Collection colConfig = getOrCreateCollection("/db/system/config/db/" + TEST_COLLECTION_NAME); + final XMLResource docConfig = colConfig.createResource(DEFAULT_COLLECTION_CONFIG_FILE, XMLResource.class)) { + docConfig.setContent(INDEX_CONFIG); + colConfig.storeResource(docConfig); + } } private Collection getOrCreateCollection(final String collectionPath) throws XMLDBException { @@ -128,7 +151,6 @@ private Collection getOrCreateCollection(final String collectionPath) throws XML } private Collection getOrCreateCollection(final Collection currentCollection, final String collectionPath) throws XMLDBException { - final int offset = collectionPath.indexOf("/") > -1 ? collectionPath.indexOf("/") : collectionPath.length(); final String colName = collectionPath.substring(0, offset); @@ -142,52 +164,59 @@ private Collection getOrCreateCollection(final Collection currentCollection, fin child = service.createCollection(colName); } - if(collectionPath.indexOf("/") == -1) { + if (collectionPath.indexOf("/") == -1) { return child; } else { final String subPath = collectionPath.substring(collectionPath.indexOf("/") + 1); - return getOrCreateCollection(child, subPath); + try { + return getOrCreateCollection(child, subPath); + } finally { + child.close(); + } } } private XQueryService storeXMLStringAndGetQueryService(String documentName, String content) throws XMLDBException { - final XMLResource doc = testCollection.createResource(documentName, XMLResource.class); - doc.setContent(content); - testCollection.storeResource(doc); - final XQueryService service = testCollection.getService(XQueryService.class); - return service; + try (final XMLResource doc = testCollection.createResource(documentName, XMLResource.class)) { + doc.setContent(content); + testCollection.storeResource(doc); + } + return testCollection.getService(XQueryService.class); } @Before public void clearCollectionConfig() throws XMLDBException { - final Collection colDb = testCollection.getParentCollection(); - - final Collection colSystem = colDb.getChildCollection("system"); - if(colSystem == null) { - return; - } - - final Collection colConfig = colSystem.getChildCollection("config"); - if(colConfig == null) { - return; - } - - final Collection colConfigDb = colConfig.getChildCollection("db"); - if(colConfigDb == null) { - return; - } - - boolean foundPubmedConfig = false; - for(final String configCol : colConfigDb.listChildCollections()) { - if(configCol.equals(TEST_COLLECTION_NAME)) { - foundPubmedConfig = true; - break; + try (final Collection colDb = testCollection.getParentCollection(); + final Collection colSystem = colDb.getChildCollection("system")) { + + if (colSystem == null) { + return; + } + + try (final Collection colConfig = colSystem.getChildCollection("config")) { + if (colConfig == null) { + return; + } + + try (final Collection colConfigDb = colConfig.getChildCollection("db")) { + if (colConfigDb == null) { + return; + } + + boolean foundPubmedConfig = false; + for (final String configCol : colConfigDb.listChildCollections()) { + if (configCol.equals(TEST_COLLECTION_NAME)) { + foundPubmedConfig = true; + break; + } + } + + if (foundPubmedConfig) { + final CollectionManagementService service = colConfigDb.getService(CollectionManagementService.class); + service.removeCollection(TEST_COLLECTION_NAME); + } + } } - } - - if(foundPubmedConfig) { - final CollectionManagementService service = colConfigDb.getService(CollectionManagementService.class); - service.removeCollection(TEST_COLLECTION_NAME); } } @@ -200,6 +229,7 @@ public static void createTestCollection() throws Exception { @AfterClass public static void tearDown() throws Exception { + testCollection.close(); final CollectionManagementService service = existEmbeddedServer.getRoot().getService( CollectionManagementService.class); diff --git a/exist-core/src/test/java/org/exist/xquery/ValueIndexByQNameTest.java b/exist-core/src/test/java/org/exist/xquery/ValueIndexByQNameTest.java index 0a6ff59eaf..0dd2d163df 100644 --- a/exist-core/src/test/java/org/exist/xquery/ValueIndexByQNameTest.java +++ b/exist-core/src/test/java/org/exist/xquery/ValueIndexByQNameTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -23,7 +47,6 @@ import org.junit.Test; import org.xmldb.api.base.XMLDBException; -import org.xmldb.api.modules.XPathQueryService; import java.net.URISyntaxException; @@ -53,23 +76,23 @@ public class ValueIndexByQNameTest extends ValueIndexTest { @Override public void strings() throws XMLDBException, URISyntaxException { configureCollection(config); - XPathQueryService service = storeXMLFileAndGetQueryService(ITEMS_FILENAME, ITEMS_FILE); + storeXMLFile(ITEMS_FILENAME, ITEMS_FILE); // queryResource(service, "items.xml", "//item[name > 'Racing Bicycle']", 4 ); - queryResource(service, "items.xml", + queryResourceV("items.xml", "util:qname-index-lookup( xs:QName('name'), 'Racing Bicycle' ) / parent::item" , 1 ); - queryResource(service, "items.xml", + queryResourceV("items.xml", "util:qname-index-lookup( xs:QName('itemno'), 3) / parent::item", 1); - queryResource(service, "items.xml", + queryResourceV("items.xml", "declare namespace xx='http://test.com'; " + "util:qname-index-lookup( xs:QName('xx:test'), 123, false() )", 1); -// queryResource(service, "items.xml", "//item[name &= 'Racing Bicycle']", 1); -// queryResource(service, "items.xml", "//item[mixed = 'uneven']", 1); - queryResource(service, "items.xml", +// queryResource("items.xml", "//item[name &= 'Racing Bicycle']", 1); +// queryResource("items.xml", "//item[mixed = 'uneven']", 1); + queryResourceV("items.xml", "util:qname-index-lookup( xs:QName('mixed'), 'external' )", 1); -// queryResource(service, "items.xml", "//item[fn:matches(mixed, 'un.*')]", 2); +// queryResource("items.xml", "//item[fn:matches(mixed, 'un.*')]", 2); } protected String getCollectionConfig() { diff --git a/exist-core/src/test/java/org/exist/xquery/ValueIndexTest.java b/exist-core/src/test/java/org/exist/xquery/ValueIndexTest.java index 40224469f0..f9d3293553 100644 --- a/exist-core/src/test/java/org/exist/xquery/ValueIndexTest.java +++ b/exist-core/src/test/java/org/exist/xquery/ValueIndexTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -27,6 +51,7 @@ import java.nio.file.Paths; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.IndexQueryService; import org.junit.After; import org.junit.Before; @@ -35,13 +60,14 @@ import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; import org.xmldb.api.base.ResourceIterator; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XPathQueryService; import org.xmldb.api.modules.XUpdateQueryService; +import javax.annotation.Nullable; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -112,6 +138,7 @@ public void setUp() throws ClassNotFoundException, IllegalAccessException, Insta @After public void tearDown() throws Exception { + testCollection.close(); final CollectionManagementService service = existEmbeddedServer.getRoot() .getService(CollectionManagementService.class); service.removeCollection("test"); @@ -122,65 +149,69 @@ public void tearDown() throws Exception { * @throws XMLDBException */ protected void configureCollection(String config) throws XMLDBException { - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); idxConf.configureCollection(config); } @Test public void strings() throws XMLDBException, URISyntaxException { configureCollection(CONFIG_PATH); - XPathQueryService service = storeXMLFileAndGetQueryService(ITEMS_FILENAME, ITEMS_FILE); - queryResource(service, ITEMS_FILENAME, "//item[@id = 'i2']", 1); - queryResource(service, ITEMS_FILENAME, "//item[name = 'Racing Bicycle']", 1); - queryResource(service, ITEMS_FILENAME, "//item[name > 'Racing Bicycle']", 4); - queryResource(service, ITEMS_FILENAME, "//item[itemno = 3]", 1); - queryResource(service, ITEMS_FILENAME, "//item[itemno eq 3]", 1); - ResourceSet result = queryResource(service, ITEMS_FILENAME, "for $i in //item[stock <= 10] return $i/itemno", 5); - for (long i = 0; i < result.getSize(); i++) { - Resource res = result.getResource(i); + storeXMLFile(ITEMS_FILENAME, ITEMS_FILE); + queryResourceV(ITEMS_FILENAME, "//item[@id = 'i2']", 1); + queryResourceV(ITEMS_FILENAME, "//item[name = 'Racing Bicycle']", 1); + queryResourceV(ITEMS_FILENAME, "//item[name > 'Racing Bicycle']", 4); + queryResourceV(ITEMS_FILENAME, "//item[itemno = 3]", 1); + queryResourceV(ITEMS_FILENAME, "//item[itemno eq 3]", 1); + + try (final EXistResourceSet result = queryResource(ITEMS_FILENAME, "for $i in //item[stock <= 10] return $i/itemno", 5)) { + for (long i = 0; i < result.getSize(); i++) { + try (final Resource res = result.getResource(i)) { + // needed to ensure that res is closed + } + } } - queryResource(service, ITEMS_FILENAME, "//item[stock > 20]", 1); - queryResource(service, ITEMS_FILENAME, "declare namespace x=\"http://www.foo.com\"; //item[x:rating > 8.0]", 2); - queryResource(service, ITEMS_FILENAME, "declare namespace xx=\"http://test.com\"; //item[@xx:test = 123]", 1); - queryResource(service, ITEMS_FILENAME, "declare namespace xx=\"http://test.com\"; //item[@xx:test eq 123]", 1); - queryResource(service, ITEMS_FILENAME, "//item[mixed = 'uneven']", 1); - queryResource(service, ITEMS_FILENAME, "//item[mixed eq 'uneven']", 1); - queryResource(service, ITEMS_FILENAME, "//item[mixed = 'external']", 1); - queryResource(service, ITEMS_FILENAME, "//item[fn:matches(mixed, 'un.*')]", 2); - queryResource(service, ITEMS_FILENAME, "//item[price/@specialprice = false()]", 2); - queryResource(service, ITEMS_FILENAME, "//item[price/@specialprice = true()]", 1); - queryResource(service, ITEMS_FILENAME, "//item[price/@specialprice eq true()]", 1); + queryResourceV(ITEMS_FILENAME, "//item[stock > 20]", 1); + queryResourceV(ITEMS_FILENAME, "declare namespace x=\"http://www.foo.com\"; //item[x:rating > 8.0]", 2); + queryResourceV(ITEMS_FILENAME, "declare namespace xx=\"http://test.com\"; //item[@xx:test = 123]", 1); + queryResourceV(ITEMS_FILENAME, "declare namespace xx=\"http://test.com\"; //item[@xx:test eq 123]", 1); + queryResourceV(ITEMS_FILENAME, "//item[mixed = 'uneven']", 1); + queryResourceV(ITEMS_FILENAME, "//item[mixed eq 'uneven']", 1); + queryResourceV(ITEMS_FILENAME, "//item[mixed = 'external']", 1); + queryResourceV(ITEMS_FILENAME, "//item[fn:matches(mixed, 'un.*')]", 2); + queryResourceV(ITEMS_FILENAME, "//item[price/@specialprice = false()]", 2); + queryResourceV(ITEMS_FILENAME, "//item[price/@specialprice = true()]", 1); + queryResourceV(ITEMS_FILENAME, "//item[price/@specialprice eq true()]", 1); } @Test public void strFunctions() throws XMLDBException { configureCollection(CONFIG_PATH); - XMLResource resource = testCollection.createResource("mondial-test.xml", XMLResource.class); - resource.setContent(CITY); - testCollection.storeResource(resource); - - XPathQueryService service = testCollection.getService(XPathQueryService.class); - queryResource(service, "mondial-test.xml", "//city[starts-with(name, 'Berl')]", 1); - queryResource(service, "mondial-test.xml", "//city[starts-with(name, 'Berlin')]", 1); - queryResource(service, "mondial-test.xml", "//city[starts-with(name, 'erlin')]", 0); - queryResource(service, "mondial-test.xml", "//city[starts-with(name, 'Erl')]", 1); - queryResource(service, "mondial-test.xml", "//city[contains(name, 'erl')]", 1); - queryResource(service, "mondial-test.xml", "//city[contains(name, 'Berlin')]", 1); - queryResource(service, "mondial-test.xml", "//city[contains(name, 'Erl')]", 1); - queryResource(service, "mondial-test.xml", "//city[ends-with(name, 'Berlin')]", 1); - queryResource(service, "mondial-test.xml", "//city[ends-with(name, 'erlin')]", 1); - queryResource(service, "mondial-test.xml", "//city[ends-with(name, 'Ber')]", 0); - - queryResource(service, "mondial-test.xml", "//city[matches(name, 'erl', 'i')]", 2); - queryResource(service, "mondial-test.xml", "//city[matches(name, 'Erl')]", 1); - queryResource(service, "mondial-test.xml", "//city[matches(name, 'Berlin', 'i')]", 1); - queryResource(service, "mondial-test.xml", "//city[matches(name, 'berlin', 'i')]", 1); - queryResource(service, "mondial-test.xml", "//city[matches(name, 'berlin')]", 0); - queryResource(service, "mondial-test.xml", "//city[matches(name, '^Berlin$')]", 1); - queryResource(service, "mondial-test.xml", "//city[matches(name, 'lin$', 'i')]", 1); - queryResource(service, "mondial-test.xml", "//city[matches(name, '.*lin$', 'i')]", 1); - queryResource(service, "mondial-test.xml", "//city[matches(name, '^lin$', 'i')]", 0); + try (XMLResource resource = testCollection.createResource("mondial-test.xml", XMLResource.class)) { + resource.setContent(CITY); + testCollection.storeResource(resource); + } + + queryResourceV("mondial-test.xml", "//city[starts-with(name, 'Berl')]", 1); + queryResourceV("mondial-test.xml", "//city[starts-with(name, 'Berlin')]", 1); + queryResourceV("mondial-test.xml", "//city[starts-with(name, 'erlin')]", 0); + queryResourceV("mondial-test.xml", "//city[starts-with(name, 'Erl')]", 1); + queryResourceV("mondial-test.xml", "//city[contains(name, 'erl')]", 1); + queryResourceV("mondial-test.xml", "//city[contains(name, 'Berlin')]", 1); + queryResourceV("mondial-test.xml", "//city[contains(name, 'Erl')]", 1); + queryResourceV("mondial-test.xml", "//city[ends-with(name, 'Berlin')]", 1); + queryResourceV("mondial-test.xml", "//city[ends-with(name, 'erlin')]", 1); + queryResourceV("mondial-test.xml", "//city[ends-with(name, 'Ber')]", 0); + + queryResourceV("mondial-test.xml", "//city[matches(name, 'erl', 'i')]", 2); + queryResourceV("mondial-test.xml", "//city[matches(name, 'Erl')]", 1); + queryResourceV("mondial-test.xml", "//city[matches(name, 'Berlin', 'i')]", 1); + queryResourceV("mondial-test.xml", "//city[matches(name, 'berlin', 'i')]", 1); + queryResourceV("mondial-test.xml", "//city[matches(name, 'berlin')]", 0); + queryResourceV("mondial-test.xml", "//city[matches(name, '^Berlin$')]", 1); + queryResourceV("mondial-test.xml", "//city[matches(name, 'lin$', 'i')]", 1); + queryResourceV("mondial-test.xml", "//city[matches(name, '.*lin$', 'i')]", 1); + queryResourceV("mondial-test.xml", "//city[matches(name, '^lin$', 'i')]", 0); } /* @@ -196,28 +227,27 @@ public void strFunctions() throws XMLDBException { @Test public void pathIndexStringMatchingFunctions() throws XMLDBException { configureCollection(CONFIG_PATH); - XMLResource resource = testCollection.createResource( "mondial-test.xml", XMLResource.class ); - resource.setContent( CITY ); - testCollection.storeResource( resource ); - - XPathQueryService service = testCollection.getService( XPathQueryService.class ); + try (final XMLResource resource = testCollection.createResource("mondial-test.xml", XMLResource.class)) { + resource.setContent(CITY); + testCollection.storeResource(resource); + } - queryResource(service, "mondial-test.xml", "//city[ starts-with( name, '^*' ) ]", 0); - queryResource(service, "mondial-test.xml", "//city[ contains( name, '^*' ) ]", 0); - queryResource(service, "mondial-test.xml", "//city[ ends-with( name, '^*' ) ]", 0); + queryResourceV("mondial-test.xml", "//city[ starts-with( name, '^*' ) ]", 0); + queryResourceV("mondial-test.xml", "//city[ contains( name, '^*' ) ]", 0); + queryResourceV("mondial-test.xml", "//city[ ends-with( name, '^*' ) ]", 0); } @Test public void pathIndexStringMatchingFunctions2() throws XMLDBException { configureCollection(CONFIG_PATH); - XMLResource resource = testCollection.createResource( "mondial-test.xml", XMLResource.class ); - resource.setContent( CITY ); - testCollection.storeResource( resource ); - - XPathQueryService service = testCollection.getService( XPathQueryService.class ); - queryResource(service, "mondial-test.xml", "//city[ starts-with( name, '(*' ) ]", 0); - queryResource(service, "mondial-test.xml", "//city[ contains( name, '*' ) ]", 0); - queryResource(service, "mondial-test.xml", "//city[ ends-with( name, '(*' ) ]", 0); + try (final XMLResource resource = testCollection.createResource("mondial-test.xml", XMLResource.class)) { + resource.setContent(CITY); + testCollection.storeResource(resource); + } + + queryResourceV("mondial-test.xml", "//city[ starts-with( name, '(*' ) ]", 0); + queryResourceV("mondial-test.xml", "//city[ contains( name, '*' ) ]", 0); + queryResourceV("mondial-test.xml", "//city[ ends-with( name, '(*' ) ]", 0); } /* @@ -232,80 +262,81 @@ public void pathIndexStringMatchingFunctions2() throws XMLDBException { @Test public void qnameIndexStringMatchingFunctions() throws XMLDBException { configureCollection( CONFIG_QNAME ); - XMLResource resource = testCollection.createResource( "mondial-test.xml", XMLResource.class ); - resource.setContent( CITY ); - testCollection.storeResource( resource ); - - XPathQueryService service = testCollection.getService( XPathQueryService.class ); + try (final XMLResource resource = testCollection.createResource("mondial-test.xml", XMLResource.class)) { + resource.setContent(CITY); + testCollection.storeResource(resource); + } - queryResource(service, "mondial-test.xml", "//city[ starts-with( name, '^*' ) ]", 0); - queryResource(service, "mondial-test.xml", "//city[ contains( name, '^*' ) ]", 0); - queryResource(service, "mondial-test.xml", "//city[ ends-with( name, '^*' ) ]", 0); + queryResourceV("mondial-test.xml", "//city[ starts-with( name, '^*' ) ]", 0); + queryResourceV("mondial-test.xml", "//city[ contains( name, '^*' ) ]", 0); + queryResourceV("mondial-test.xml", "//city[ ends-with( name, '^*' ) ]", 0); } @Test public void qnameIndexStringMatchingFunctions2() throws XMLDBException { configureCollection( CONFIG_QNAME ); - XMLResource resource = testCollection.createResource( "mondial-test.xml", XMLResource.class ); - resource.setContent( CITY ); - testCollection.storeResource( resource ); - - XPathQueryService service = testCollection.getService( XPathQueryService.class ); - queryResource(service, "mondial-test.xml", "//city[ starts-with( name, '(*' ) ]", 0); - queryResource(service, "mondial-test.xml", "//city[ contains( name, '*' ) ]", 0); - queryResource(service, "mondial-test.xml", "//city[ ends-with( name, '(*' ) ]", 0); + try (final XMLResource resource = testCollection.createResource("mondial-test.xml", XMLResource.class)) { + resource.setContent(CITY); + testCollection.storeResource(resource); + } + + queryResourceV("mondial-test.xml", "//city[ starts-with( name, '(*' ) ]", 0); + queryResourceV("mondial-test.xml", "//city[ contains( name, '*' ) ]", 0); + queryResourceV("mondial-test.xml", "//city[ ends-with( name, '(*' ) ]", 0); } @Test public void strFunctionsQName() throws XMLDBException { configureCollection(CONFIG_QNAME); - XMLResource resource = testCollection.createResource("mondial-test.xml", XMLResource.class); - resource.setContent(CITY); - testCollection.storeResource(resource); - - XPathQueryService service = testCollection.getService(XPathQueryService.class); - queryResource(service, "mondial-test.xml", "//city[starts-with(name, 'Berl')]", 1); - queryResource(service, "mondial-test.xml", "//city[starts-with(name, 'Berlin')]", 1); - queryResource(service, "mondial-test.xml", "//city[starts-with(name, 'erlin')]", 0); - queryResource(service, "mondial-test.xml", "//city[starts-with(name, 'Erl')]", 1); - queryResource(service, "mondial-test.xml", "//city[contains(name, 'erl')]", 1); - queryResource(service, "mondial-test.xml", "//city[contains(name, 'Berlin')]", 1); - queryResource(service, "mondial-test.xml", "//city[contains(name, 'Erl')]", 1); - queryResource(service, "mondial-test.xml", "//city[ends-with(name, 'Berlin')]", 1); - queryResource(service, "mondial-test.xml", "//city[ends-with(name, 'erlin')]", 1); - queryResource(service, "mondial-test.xml", "//city[ends-with(name, 'Ber')]", 0); - - queryResource(service, "mondial-test.xml", "//city[matches(name, 'erl', 'i')]", 2); - queryResource(service, "mondial-test.xml", "//city[matches(name, 'Erl')]", 1); - queryResource(service, "mondial-test.xml", "//city[matches(name, 'Berlin', 'i')]", 1); - queryResource(service, "mondial-test.xml", "//city[matches(name, 'berlin', 'i')]", 1); - queryResource(service, "mondial-test.xml", "//city[matches(name, 'berlin')]", 0); - queryResource(service, "mondial-test.xml", "//city[matches(name, '^Berlin$')]", 1); - queryResource(service, "mondial-test.xml", "//city[matches(name, 'lin$', 'i')]", 1); - queryResource(service, "mondial-test.xml", "//city[matches(name, '.*lin$', 'i')]", 1); - queryResource(service, "mondial-test.xml", "//city[matches(name, '^lin$', 'i')]", 0); + try (final XMLResource resource = testCollection.createResource("mondial-test.xml", XMLResource.class)) { + resource.setContent(CITY); + testCollection.storeResource(resource); + } + + queryResourceV("mondial-test.xml", "//city[starts-with(name, 'Berl')]", 1); + queryResourceV("mondial-test.xml", "//city[starts-with(name, 'Berlin')]", 1); + queryResourceV("mondial-test.xml", "//city[starts-with(name, 'erlin')]", 0); + queryResourceV("mondial-test.xml", "//city[starts-with(name, 'Erl')]", 1); + queryResourceV("mondial-test.xml", "//city[contains(name, 'erl')]", 1); + queryResourceV("mondial-test.xml", "//city[contains(name, 'Berlin')]", 1); + queryResourceV("mondial-test.xml", "//city[contains(name, 'Erl')]", 1); + queryResourceV("mondial-test.xml", "//city[ends-with(name, 'Berlin')]", 1); + queryResourceV("mondial-test.xml", "//city[ends-with(name, 'erlin')]", 1); + queryResourceV("mondial-test.xml", "//city[ends-with(name, 'Ber')]", 0); + + queryResourceV("mondial-test.xml", "//city[matches(name, 'erl', 'i')]", 2); + queryResourceV("mondial-test.xml", "//city[matches(name, 'Erl')]", 1); + queryResourceV("mondial-test.xml", "//city[matches(name, 'Berlin', 'i')]", 1); + queryResourceV("mondial-test.xml", "//city[matches(name, 'berlin', 'i')]", 1); + queryResourceV("mondial-test.xml", "//city[matches(name, 'berlin')]", 0); + queryResourceV("mondial-test.xml", "//city[matches(name, '^Berlin$')]", 1); + queryResourceV("mondial-test.xml", "//city[matches(name, 'lin$', 'i')]", 1); + queryResourceV("mondial-test.xml", "//city[matches(name, '.*lin$', 'i')]", 1); + queryResourceV("mondial-test.xml", "//city[matches(name, '^lin$', 'i')]", 0); } @Test public void qnameIndex() throws XMLDBException, URISyntaxException { configureCollection(CONFIG_QNAME); - XPathQueryService service = storeXMLFileAndGetQueryService(ITEMS_FILENAME, ITEMS_FILE); - queryResource(service, ITEMS_FILENAME, "//((#exist:optimize#) { item[stock = 10] })", 1); - queryResource(service, ITEMS_FILENAME, "//((#exist:optimize#) { item[stock > 20] })", 1); - queryResource(service, ITEMS_FILENAME, "//((#exist:optimize#) { item[stock < 16] })", 6); - queryResource(service, ITEMS_FILENAME, "declare namespace x=\"http://www.foo.com\"; " + + storeXMLFile(ITEMS_FILENAME, ITEMS_FILE); + queryResourceV(ITEMS_FILENAME, "//((#exist:optimize#) { item[stock = 10] })", 1); + queryResourceV(ITEMS_FILENAME, "//((#exist:optimize#) { item[stock > 20] })", 1); + queryResourceV(ITEMS_FILENAME, "//((#exist:optimize#) { item[stock < 16] })", 6); + queryResourceV(ITEMS_FILENAME, "declare namespace x=\"http://www.foo.com\"; " + "//((#exist:optimize#) { item[x:rating > 8.0] })", 2); - queryResource(service, ITEMS_FILENAME, "//((#exist:optimize#) { item[mixed = 'uneven'] })", 1); - queryResource(service, ITEMS_FILENAME, "//((#exist:optimize#) { item[mixed = 'external'] })", 1); - queryResource(service, ITEMS_FILENAME, "//((#exist:optimize#) { item[@id = 'i1'] })",1); - queryResource(service, ITEMS_FILENAME, "declare namespace xx=\"http://test.com\";" + + queryResourceV(ITEMS_FILENAME, "//((#exist:optimize#) { item[mixed = 'uneven'] })", 1); + queryResourceV(ITEMS_FILENAME, "//((#exist:optimize#) { item[mixed = 'external'] })", 1); + queryResourceV(ITEMS_FILENAME, "//((#exist:optimize#) { item[@id = 'i1'] })",1); + queryResourceV(ITEMS_FILENAME, "declare namespace xx=\"http://test.com\";" + "//((#exist:optimize#) { item[@xx:test = 123] })", 1); } @Test public void indexScan() throws XMLDBException, URISyntaxException { configureCollection(CONFIG_PATH); - String queryBody = + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + + final String queryBody = "declare namespace f=\'http://exist-db.org/xquery/test\';\n" + "declare namespace mods='http://www.loc.gov/mods/v3';\n" + "import module namespace u=\'http://exist-db.org/xquery/util\';\n" + @@ -319,26 +350,32 @@ public void indexScan() throws XMLDBException, URISyntaxException { "};\n" + "\n"; - XPathQueryService service = storeXMLFileAndGetQueryService(ITEMS_FILENAME, ITEMS_FILE); + storeXMLFile(ITEMS_FILENAME, ITEMS_FILE); String query = queryBody + "u:index-keys(//item/name, \'\', util:function(xs:QName(\'f:term-callback\'), 2), 1000)"; - ResourceSet result = service.query(query); - for (ResourceIterator i = result.getIterator(); i.hasMoreResources(); ) { - i.nextResource().getContent(); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + for (final ResourceIterator i = result.getIterator(); i.hasMoreResources(); ) { + try (final Resource resource = i.nextResource()) { + resource.getContent(); + } + } + assertEquals(7, result.getSize()); } - assertEquals(7, result.getSize()); query = queryBody + "u:index-keys(//item/stock, 0, util:function(xs:QName(\'f:term-callback\'), 2), 1000)"; - result = service.query(query); - for (ResourceIterator i = result.getIterator(); i.hasMoreResources(); ) { - i.nextResource().getContent(); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + for (final ResourceIterator i = result.getIterator(); i.hasMoreResources(); ){ + try (final Resource resource = i.nextResource()) { + resource.getContent(); + } + } + assertEquals(5, result.getSize()); } - assertEquals(5, result.getSize()); } @Test public void updates() throws Exception { configureCollection(CONFIG_PATH); - storeXMLFileAndGetQueryService(ITEMS_FILENAME, ITEMS_FILE); + storeXMLFile(ITEMS_FILENAME, ITEMS_FILE); for (int i = 100; i <= 150; i++) { String append = "" + @@ -355,22 +392,22 @@ public void updates() throws Exception { " " + ""; - XPathQueryService query = testCollection.getService(XPathQueryService.class); - XUpdateQueryService update = testCollection.getService(XUpdateQueryService.class); + final XUpdateQueryService update = testCollection.getService(XUpdateQueryService.class); long mods = update.updateResource(ITEMS_FILENAME, append); assertEquals(mods, 1); - queryResource(query, ITEMS_FILENAME, "//item[price = 55.50]", 1); - queryResource(query, ITEMS_FILENAME, "//item[@id = 'i" + i + "']",1); + + queryResourceV(ITEMS_FILENAME, "//item[price = 55.50]", 1); + queryResourceV(ITEMS_FILENAME, "//item[@id = 'i" + i + "']",1); mods = update.updateResource(ITEMS_FILENAME, remove); assertEquals(mods, 1); - queryResource(query, ITEMS_FILENAME, "//item[itemno = " + i + "]", 0); + queryResourceV(ITEMS_FILENAME, "//item[itemno = " + i + "]", 0); } } @Test public void updatesQName() throws Exception { configureCollection(CONFIG_QNAME); - storeXMLFileAndGetQueryService(ITEMS_FILENAME, ITEMS_FILE); + storeXMLFile(ITEMS_FILENAME, ITEMS_FILE); for (int i = 100; i <= 150; i++) { String append = "" + @@ -386,51 +423,47 @@ public void updatesQName() throws Exception { "" + " " + ""; - - XPathQueryService query = testCollection.getService(XPathQueryService.class); - XUpdateQueryService update = testCollection.getService(XUpdateQueryService.class); + + final XUpdateQueryService update = testCollection.getService(XUpdateQueryService.class); long mods = update.updateResource(ITEMS_FILENAME, append); assertEquals(mods, 1); - queryResource(query, ITEMS_FILENAME, "//((#exist:optimize#) { item[price = 55.50] })", 1); - queryResource(query, ITEMS_FILENAME, "//((#exist:optimize#) { item[@id = 'i" + i + "']})",1); - queryResource(query, ITEMS_FILENAME, "//((#exist:optimize#) { item[itemno = " + i + "] })", 1); + + queryResourceV(ITEMS_FILENAME, "//((#exist:optimize#) { item[price = 55.50] })", 1); + queryResourceV(ITEMS_FILENAME, "//((#exist:optimize#) { item[@id = 'i" + i + "']})",1); + queryResourceV(ITEMS_FILENAME, "//((#exist:optimize#) { item[itemno = " + i + "] })", 1); mods = update.updateResource(ITEMS_FILENAME, remove); assertEquals(mods, 1); - queryResource(query, ITEMS_FILENAME, "//((#exist:optimize#) { item[itemno = " + i + "] })", 0); + queryResourceV(ITEMS_FILENAME, "//((#exist:optimize#) { item[itemno = " + i + "] })", 0); } } - protected ResourceSet queryResource(XPathQueryService service, - String resource, String query, int expected) throws XMLDBException { - return queryResource(service, resource, query, expected, null); + protected void queryResourceV(final String resource, final String query, final int expected) throws XMLDBException { + try (final EXistResourceSet result = queryResource(resource, query, expected, null)) { + // needed to ensure that result is closed + } } - /** - * @param service - * @throws XMLDBException - */ - private ResourceSet queryResource(XPathQueryService service, - String resource, String query, int expected, String message) + protected EXistResourceSet queryResource(final String resource, final String query, final int expected) throws XMLDBException { + return queryResource(resource, query, expected, null); + } + + private EXistResourceSet queryResource(final String resource, final String query, final int expected, @Nullable final String message) throws XMLDBException { - ResourceSet result = service.queryResource(resource, query); - if (message == null) + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + final EXistResourceSet result = (EXistResourceSet) service.queryResource(resource, query); + if (message == null) { assertEquals(expected, result.getSize()); - else + } else { assertEquals(message, expected, result.getSize()); + } return result; } - /** - * @return - * @throws XMLDBException - */ - protected XPathQueryService storeXMLFileAndGetQueryService( - String documentName, final URL srcFile) throws XMLDBException, URISyntaxException { - XMLResource doc = testCollection.createResource(documentName, XMLResource.class); - Path f = Paths.get(srcFile.toURI()); - doc.setContent(f); - testCollection.storeResource(doc); - XPathQueryService service = testCollection.getService(XPathQueryService.class); - return service; + protected void storeXMLFile(final String documentName, final URL srcFile) throws XMLDBException, URISyntaxException { + try (final XMLResource doc = testCollection.createResource(documentName, XMLResource.class)) { + final Path f = Paths.get(srcFile.toURI()); + doc.setContent(f); + testCollection.storeResource(doc); + } } } \ No newline at end of file diff --git a/exist-core/src/test/java/org/exist/xquery/VariablesTest.java b/exist-core/src/test/java/org/exist/xquery/VariablesTest.java index ffa3cb4ad3..91a1f030fd 100644 --- a/exist-core/src/test/java/org/exist/xquery/VariablesTest.java +++ b/exist-core/src/test/java/org/exist/xquery/VariablesTest.java @@ -48,13 +48,14 @@ import org.exist.TestUtils; import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.xmldb.EXistResource; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.XmldbURI; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; @@ -101,9 +102,12 @@ public void callModule() throws XMLDBException { "import module namespace mod1 = \"http://mod1\" at \"xmldb:exist:///db/variables-test/mod1.xqm\";\n" + "$mod1:PUBLICATIONS(\"open-graph\")"; - final ResourceSet rs = existEmbeddedServer.executeQuery(query); - assertEquals(1, rs.getSize()); - assertEquals(XML_RESOURCE, rs.getResource(0).getResourceType()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(XML_RESOURCE, resource.getResourceType()); + } + } } private static Collection createCollection(final String collectionName) throws XMLDBException { @@ -111,7 +115,7 @@ private static Collection createCollection(final String collectionName) throws X final CollectionManagementService cmService = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); if (collection == null) { //cmService.removeCollection(collectionName); - cmService.createCollection(collectionName); + try (final Collection created = cmService.createCollection(collectionName)) { } } collection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + collectionName, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); @@ -120,10 +124,11 @@ private static Collection createCollection(final String collectionName) throws X } private static void writeModule(final Collection collection, final String modulename, final String module) throws XMLDBException { - final BinaryResource res = collection.createResource(modulename, BinaryResource.class); - ((EXistResource) res).setMediaType(MediaType.APPLICATION_XQUERY); - res.setContent(module.getBytes()); - collection.storeResource(res); + try (final BinaryResource res = collection.createResource(modulename, BinaryResource.class)) { + ((EXistResource) res).setMediaType(MediaType.APPLICATION_XQUERY); + res.setContent(module.getBytes()); + collection.storeResource(res); + } collection.close(); } } diff --git a/exist-core/src/test/java/org/exist/xquery/WatchdogTest.java b/exist-core/src/test/java/org/exist/xquery/WatchdogTest.java index 3ee69ae1b6..4278e37820 100644 --- a/exist-core/src/test/java/org/exist/xquery/WatchdogTest.java +++ b/exist-core/src/test/java/org/exist/xquery/WatchdogTest.java @@ -53,8 +53,8 @@ public static void setup() throws XMLDBException { "};"; try (final Collection dbCollection = existEmbeddedServer.getRoot(); - final Collection watchdogTestCollection = existEmbeddedServer.createCollection(dbCollection, "watchdog-test")) { - final Resource nodesModule = watchdogTestCollection.createResource("nodes.xqm", BinaryResource.class); + final Collection watchdogTestCollection = existEmbeddedServer.createCollection(dbCollection, "watchdog-test"); + final Resource nodesModule = watchdogTestCollection.createResource("nodes.xqm", BinaryResource.class)) { nodesModule.setContent(queryModule); watchdogTestCollection.storeResource(nodesModule); } diff --git a/exist-core/src/test/java/org/exist/xquery/XPathOpOrSpecialCaseTest.java b/exist-core/src/test/java/org/exist/xquery/XPathOpOrSpecialCaseTest.java index d67c5d4d67..3f0badb521 100644 --- a/exist-core/src/test/java/org/exist/xquery/XPathOpOrSpecialCaseTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XPathOpOrSpecialCaseTest.java @@ -48,6 +48,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; import org.xmldb.api.base.Collection; @@ -82,11 +83,14 @@ public void setUp() throws Exception @After public void tearDown() throws Exception { + if (testCollection != null) { + testCollection.close(); + testCollection = null; + } final CollectionManagementService service = existEmbeddedServer.getRoot().getService( CollectionManagementService.class); service.removeCollection("blah"); - testCollection = null; } /** @@ -95,15 +99,13 @@ public void tearDown() throws Exception { * expect org.exist.xquery.XPathException: exerr:ERROR cannot convert xs:boolean('false') to a node set. */ @Test - public void verifyOpOrInPredicate() throws Exception - { - try - { + public void verifyOpOrInPredicate() throws Exception { + try { storeXML(testCollection, "blah.xml", "No element content."); - existEmbeddedServer.executeQuery("/blah[a='A' or b='B']"); - } - catch(final XMLDBException e) - { + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("/blah[a='A' or b='B']")) { + // needed to close the result + } + } catch(final XMLDBException e) { LOG.error(e.getMessage(), e); throw e; } @@ -116,10 +118,11 @@ public void verifyOpOrInPredicate() throws Exception * @param content The XML content to be stored. * @throws XMLDBException See {@link XMLDBException}. */ - private void storeXML(final Collection collection, final String documentName, final String content) throws XMLDBException + private void storeXML(final Collection collection, final String documentName, final String content) throws XMLDBException { - final XMLResource doc = collection.createResource(documentName, XMLResource.class); - doc.setContent(content); - collection.storeResource(doc); + try (final XMLResource doc = collection.createResource(documentName, XMLResource.class)) { + doc.setContent(content); + collection.storeResource(doc); + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/XPathQueryTest.java b/exist-core/src/test/java/org/exist/xquery/XPathQueryTest.java index 8b2ee35a63..6d77c432bf 100644 --- a/exist-core/src/test/java/org/exist/xquery/XPathQueryTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XPathQueryTest.java @@ -46,10 +46,15 @@ package org.exist.xquery; import org.exist.test.ExistWebServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.EXistXPathQueryService; import org.exist.xmldb.EXistXQueryService; import org.exist.xmldb.XmldbURI; -import org.junit.*; +import org.junit.After; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -58,19 +63,26 @@ import org.w3c.dom.Node; import org.xml.sax.InputSource; import org.xml.sax.SAXException; +import org.xmldb.api.base.Collection; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; +import org.xmldb.api.base.CompiledExpression; +import org.xmldb.api.base.Database; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XPathQueryService; import org.xmldb.api.modules.XQueryService; import org.xmlunit.matchers.CompareMatcher; +import javax.annotation.Nullable; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.io.StringReader; import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; @@ -252,21 +264,21 @@ private final String getBaseUri() { @Before public void setUp() throws Exception { // initialize driver - Class cl = Class.forName("org.exist.xmldb.DatabaseImpl"); - Database database = (Database) cl.newInstance(); + final Class cl = Class.forName("org.exist.xmldb.DatabaseImpl"); + final Database database = (Database) cl.newInstance(); database.setProperty("create-database", "true"); DatabaseManager.registerDatabase(database); - Collection root = - DatabaseManager.getCollection( - getBaseUri(), - "admin", - ""); - CollectionManagementService service = - root.getService( - CollectionManagementService.class); - testCollection = service.createCollection("test"); - assertNotNull(testCollection); + try (final Collection root = DatabaseManager.getCollection(getBaseUri(), "admin", "")) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + testCollection = service.createCollection("test"); + assertNotNull(testCollection); + } + } + + @After + public void teadDown() throws XMLDBException { + testCollection.close(); } @Test @@ -277,15 +289,15 @@ public void childWildcards() throws XMLDBException { service.setNamespace("t", "http://test"); - queryResource(service, docName, "/t:test", 1); //make sure all is well! + queryResourceV(service, docName, "/t:test", 1); //make sure all is well! - queryResource(service, docName, "/*", 1); - queryResource(service, docName, "/t:*", 1); - queryResource(service, docName, "/*:test", 1); + queryResourceV(service, docName, "/*", 1); + queryResourceV(service, docName, "/t:*", 1); + queryResourceV(service, docName, "/*:test", 1); - queryResource(service, docName, "/child::*", 1); - queryResource(service, docName, "/child::t:*", 1); - queryResource(service, docName, "/child::*:test", 1); + queryResourceV(service, docName, "/child::*", 1); + queryResourceV(service, docName, "/child::t:*", 1); + queryResourceV(service, docName, "/child::*:test", 1); } @Test @@ -296,8 +308,8 @@ public void pathExpression() throws XMLDBException { //Invalid path expression left operand (not a node set). String message = ""; try { - queryAndAssert(service, "('a', 'b', 'c')/position()", -1, null); - } catch (XMLDBException e) { + queryAndAssertV(service, "('a', 'b', 'c')/position()", -1, null); + } catch (final XMLDBException e) { message = e.getMessage(); } assertTrue("Exception wanted: " + message, message.indexOf("XPTY0019") > -1); @@ -305,8 +317,8 @@ public void pathExpression() throws XMLDBException { //Undefined context sequence message = ""; try { - queryAndAssert(service, "for $a in (, , doh, ) return $a", -1, null); - } catch (XMLDBException e) { + queryAndAssertV(service, "for $a in (, , doh, ) return $a", -1, null); + } catch (final XMLDBException e) { message = e.getMessage(); } assertTrue("Exception wanted: " + message, message.indexOf("XPDY0002") > -1); @@ -314,25 +326,25 @@ public void pathExpression() throws XMLDBException { message = ""; try { //"1 to 2" is resolved as a (1, 2), i.e. a sequence of *integers* which is *not* a singleton - queryAndAssert(service, "let $a := (1, 2, 3) for $b in $a[1 to 2] return $b", -1, null); - } catch (XMLDBException e) { + queryAndAssertV(service, "let $a := (1, 2, 3) for $b in $a[1 to 2] return $b", -1, null); + } catch (final XMLDBException e) { message = e.getMessage(); } //No effective boolean value for such a kind of sequence ! assertTrue("Exception wanted: " + message, message.indexOf("FORG0006") >-1); - queryAndAssert(service, "let $a := ('a', 'b', 'c') return $a[2 to 2]", 1, null); - queryAndAssert(service, "let $a := ('a', 'b', 'c') return $a[(2 to 2)]", 1, null); - queryAndAssert(service, "let $x := return ($x/@min to $x/@max)", 10, null); - queryAndAssert(service, "(1,2,3)[xs:decimal(.)]", 3, null); - queryAndAssert(service, "(1,2,3)[. lt 3]", 2, null); - queryAndAssert(service, "(0, 1, 2)[if(. eq 1) then 0 else position()]", 2, null); - queryAndAssert(service, "(1, 2, 3)[if(1) then 1 else last()]", 1, null); - queryAndAssert(service, "(1, 2, 3)[if(1) then 1 else position()]", 1, null); - queryAndAssert(service, "()/position()", 0, null); - queryAndAssert(service, "(0, 1, 2)[if(. eq 1) then 2 else 3]", 2, null); - queryAndAssert(service, "(0, 1, 2)[remove((1, 'a string'), 2)]", 1, null); - queryAndAssert(service, "let $page-ix := (1,3) return ($page-ix[1] to $page-ix[2])", 3, null); + queryAndAssertV(service, "let $a := ('a', 'b', 'c') return $a[2 to 2]", 1, null); + queryAndAssertV(service, "let $a := ('a', 'b', 'c') return $a[(2 to 2)]", 1, null); + queryAndAssertV(service, "let $x := return ($x/@min to $x/@max)", 10, null); + queryAndAssertV(service, "(1,2,3)[xs:decimal(.)]", 3, null); + queryAndAssertV(service, "(1,2,3)[. lt 3]", 2, null); + queryAndAssertV(service, "(0, 1, 2)[if(. eq 1) then 0 else position()]", 2, null); + queryAndAssertV(service, "(1, 2, 3)[if(1) then 1 else last()]", 1, null); + queryAndAssertV(service, "(1, 2, 3)[if(1) then 1 else position()]", 1, null); + queryAndAssertV(service, "()/position()", 0, null); + queryAndAssertV(service, "(0, 1, 2)[if(. eq 1) then 2 else 3]", 2, null); + queryAndAssertV(service, "(0, 1, 2)[remove((1, 'a string'), 2)]", 1, null); + queryAndAssertV(service, "let $page-ix := (1,3) return ($page-ix[1] to $page-ix[2])", 3, null); } /** test simple queries involving attributes */ @@ -344,18 +356,21 @@ public void attributes() throws XMLDBException { testDocument, numbers); String query = "/test/item[ @id='1' ]"; - ResourceSet result = service.queryResource(testDocument, query); - assertEquals("XPath: " + query, 1, result.getSize()); - - XMLResource resource = (XMLResource)result.getResource(0); - Node node = resource.getContentAsDOM(); - if (node.getNodeType() == Node.DOCUMENT_NODE) - node = node.getFirstChild(); - assertEquals("XPath: " + query, "item", node.getNodeName()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(testDocument, query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + Node node = resource.getContentAsDOM(); + if (node.getNodeType() == Node.DOCUMENT_NODE) + node = node.getFirstChild(); + assertEquals("XPath: " + query, "item", node.getNodeName()); + } + } query = "/test/item [ @type='alphanum' ]"; - result = service.queryResource(testDocument, query); - assertEquals("XPath: " + query, 1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(testDocument, query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + } } @Test @@ -363,18 +378,22 @@ public void starAxis() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService("numbers.xml", numbers); - ResourceSet result = service.queryResource("numbers.xml", "/*/item"); - assertEquals("XPath: /*/item", 4, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", "/*/item")) { + assertEquals("XPath: /*/item", 4, result.getSize()); + } - result = service.queryResource("numbers.xml", "/test/*"); - assertEquals("XPath: /test/*", 4, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", "/test/*")) { + assertEquals("XPath: /test/*", 4, result.getSize()); + } - result = service.queryResource("numbers.xml", "/test/descendant-or-self::*"); - assertEquals("XPath: /test/descendant-or-self::*", 13, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", "/test/descendant-or-self::*")) { + assertEquals("XPath: /test/descendant-or-self::*", 13, result.getSize()); + } - result = service.queryResource("numbers.xml", "/*/*"); - //Strange !!! Should be 8 - assertEquals("XPath: /*/*", 4, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", "/*/*")) { + //Strange !!! Should be 8 + assertEquals("XPath: /*/*", 4, result.getSize()); + } } @Test @@ -384,36 +403,44 @@ public void starAxisConstraints() throws XMLDBException { service.setNamespace("t", "http://www.foo.com"); String query = "// t:title/text() [ . != 'aaaa' ]"; - ResourceSet result = service.queryResource( "namespaces.xml", query); - assertEquals("XPath: " + query, 1, result.getSize() ); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + } query = "/t:test/*:section[contains(., 'comment')]"; - result = service.queryResource("namespaces.xml", query); - assertEquals("XPath: " + query, 1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + } query = "/t:test/t:*[contains(., 'comment')]"; - result = service.queryResource("namespaces.xml", query); - assertEquals("XPath: " + query, 1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + } query = "/t:test/t:section[contains(., 'comment')]"; - result = service.queryResource("namespaces.xml", query); - assertEquals("XPath: " + query, 1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + } query = "/t:test/t:section/*[contains(., 'comment')]"; - result = service.queryResource("namespaces.xml", query); - assertEquals("XPath: " + query, 1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + } query = "/ * / * [ t:title ]"; - result = service.queryResource( "namespaces.xml", query); - assertEquals("XPath: " + query, 1, result.getSize() ); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + } query = "/ t:test / t:section [ t:title ]"; - result = service.queryResource( "namespaces.xml", query); - assertEquals("XPath: " + query, 1, result.getSize() ); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + } query = "/ t:test / t:section"; - result = service.queryResource( "namespaces.xml", query); - assertEquals("XPath: " + query, 1, result.getSize() ); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + } } @Test @@ -423,12 +450,14 @@ public void starAxisConstraints2() throws XMLDBException { service.setNamespace("t", "http://www.foo.com"); String query = "/ * [ ./ * / t:title ]"; - ResourceSet result = service.queryResource( "namespaces.xml", query); - assertEquals("XPath: " + query, 1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + } query = "/ * [ * / t:title ]"; - result = service.queryResource( "namespaces.xml", query); - assertEquals("XPath: " + query, 1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + } } @Test @@ -438,28 +467,36 @@ public void starAxisConstraints3() throws XMLDBException { service.setNamespace("t", "http://www.foo.com"); final String query = "// * [ . = 'Test Document' ]"; - final ResourceSet result = service.queryResource("namespaces.xml", query); - assertEquals("XPath: " + query, 1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + } } @Test public void root() throws XMLDBException { storeXMLStringAndGetQueryService("nested2.xml", nested2); final XQueryService service = storeXMLStringAndGetQueryService("numbers.xml", numbers); + String query = "let $doc := return root($doc)"; - ResourceSet result = service.queryResource("numbers.xml", query); - assertEquals("XPath: " + query, 1, result.getSize()); - final XMLResource resource = (XMLResource)result.getResource(0); - Node node = resource.getContentAsDOM(); - //Oh dear ! Don't tell me that *I* have written this :'( -pb - if (node.getNodeType() == Node.DOCUMENT_NODE) { - node = node.getFirstChild(); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + Node node = resource.getContentAsDOM(); + //Oh dear ! Don't tell me that *I* have written this :'( -pb + if (node.getNodeType() == Node.DOCUMENT_NODE) { + node = node.getFirstChild(); + } + assertEquals("XPath: " + query, "a", node.getNodeName()); + } } - assertEquals("XPath: " + query, "a", node.getNodeName()); query = "let $c := (,,,,) return count($c/root())"; - result = service.queryResource("numbers.xml", query); - assertEquals("5", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("5", resource.getContent().toString()); + } + } } @Test @@ -468,11 +505,15 @@ public void name() throws XMLDBException { storeXMLStringAndGetQueryService("nested2.xml", nested2); final String query = "(,)/name()"; - final ResourceSet result = service.queryResource("nested2.xml", query); - - assertEquals("XPath: " + query, 2, result.getSize()); - assertEquals("a", result.getResource(0).getContent().toString()); - assertEquals("b", result.getResource(1).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("nested2.xml", query)) { + assertEquals("XPath: " + query, 2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("a", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("b", resource.getContent().toString()); + } + } } @Test @@ -480,27 +521,41 @@ public void parentAxis() throws XMLDBException { XQueryService service = storeXMLStringAndGetQueryService("nested2.xml", nested2); - queryResource(service, "nested2.xml", "(, , )/parent::*", 0); - queryResource(service, "nested2.xml", "/RootElement//ChildB/parent::*", 1); - queryResource(service, "nested2.xml", "/RootElement//ChildB/parent::*/ChildB", 1); - queryResource(service, "nested2.xml", "/RootElement/ChildA/parent::*/ChildA/ChildB", 1); + queryResourceV(service, "nested2.xml", "(, , )/parent::*", 0); + queryResourceV(service, "nested2.xml", "/RootElement//ChildB/parent::*", 1); + queryResourceV(service, "nested2.xml", "/RootElement//ChildB/parent::*/ChildB", 1); + queryResourceV(service, "nested2.xml", "/RootElement/ChildA/parent::*/ChildA/ChildB", 1); - service = - storeXMLStringAndGetQueryService("numbers2.xml", numbers2); + service = storeXMLStringAndGetQueryService("numbers2.xml", numbers2); service.setNamespace("n", "http://numbers.org"); - queryResource(service, "numbers2.xml", "//n:price[. = 18.4]/parent::*[@id = '3']", 1); - queryResource(service, "numbers2.xml", "//n:price[. = 18.4]/parent::n:item[@id = '3']", 1); - queryResource(service, "numbers2.xml", "//n:price/parent::n:item[@id = '3']", 1); - ResourceSet result = - queryResource(service, "numbers2.xml", "//n:price[. = 18.4]/parent::n:*/string(@id)", 1); - assertEquals("3", result.getResource(0).getContent().toString()); - result = queryResource(service, "numbers2.xml", "//n:price[. = 18.4]/parent::*:item/string(@id)", 1); - assertEquals("3", result.getResource(0).getContent().toString()); - result = queryResource(service, "numbers2.xml", "//n:price[. = 18.4]/../string(@id)", 1); - assertEquals("3", result.getResource(0).getContent().toString()); - result = queryResource(service, "numbers2.xml", "//n:price[. = 18.4]/parent::n:item/string(@id)", 1); - assertEquals("3", result.getResource(0).getContent().toString()); - queryResource(service, "numbers2.xml", + queryResourceV(service, "numbers2.xml", "//n:price[. = 18.4]/parent::*[@id = '3']", 1); + queryResourceV(service, "numbers2.xml", "//n:price[. = 18.4]/parent::n:item[@id = '3']", 1); + queryResourceV(service, "numbers2.xml", "//n:price/parent::n:item[@id = '3']", 1); + + try (final EXistResourceSet result = queryResource(service, "numbers2.xml", "//n:price[. = 18.4]/parent::n:*/string(@id)", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent().toString()); + } + } + + try (final EXistResourceSet result = queryResource(service, "numbers2.xml", "//n:price[. = 18.4]/parent::*:item/string(@id)", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent().toString()); + } + } + + try (final EXistResourceSet result = queryResource(service, "numbers2.xml", "//n:price[. = 18.4]/../string(@id)", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent().toString()); + } + } + + try (final EXistResourceSet result = queryResource(service, "numbers2.xml", "//n:price[. = 18.4]/parent::n:item/string(@id)", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent().toString()); + } + } + queryResourceV(service, "numbers2.xml", "for $price in //n:price where $price/parent::*[@id = '3']/n:stock = '5' return $price", 1); } @@ -509,18 +564,19 @@ public void parentSelfAxis() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService("nested2.xml", nested2); storeXMLStringAndGetQueryService("numbers.xml", numbers); - queryResource(service, "nested2.xml", "/RootElement/descendant::*/parent::ChildA", 1); - queryResource(service, "nested2.xml", "/RootElement/descendant::*[self::ChildB]/parent::RootElement", 0); - queryResource(service, "nested2.xml", "/RootElement/descendant::*[self::ChildA]/parent::RootElement", 1); - queryResource(service, "nested2.xml", "let $a := ('', 'b', '', '') for $b in $a[.] return {$b}", 1); + queryResourceV(service, "nested2.xml", "/RootElement/descendant::*/parent::ChildA", 1); + queryResourceV(service, "nested2.xml", "/RootElement/descendant::*[self::ChildB]/parent::RootElement", 0); + queryResourceV(service, "nested2.xml", "/RootElement/descendant::*[self::ChildA]/parent::RootElement", 1); + queryResourceV(service, "nested2.xml", "let $a := ('', 'b', '', '') for $b in $a[.] return {$b}", 1); final String query = "let $doc := ab" + "return " + "for $element in $doc/page/* " + "return " + "if($element[self::a] or $element[self::b]) then () else ()"; - final ResourceSet result = service.queryResource("numbers.xml", query); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query)) { + assertEquals(2, result.getSize()); + } } @Test @@ -528,26 +584,26 @@ public void selfAxis() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService("self.xml", self); - queryResource(service, "self.xml", "/test-self/self::document-node()", 0); - queryResource(service, "self.xml", "/test-self/self::node()", 1); - queryResource(service, "self.xml", "/test-self/self::attribute()", 0); - queryResource(service, "self.xml", "/test-self/self::element()", 1); - queryResource(service, "self.xml", "/test-self/self::comment()", 0); - queryResource(service, "self.xml", "/test-self/self::processing-instruction()", 0); - queryResource(service, "self.xml", "/test-self/self::text()", 0); - queryResource(service, "self.xml", "/test-self/self::namespace-node()", 0); + queryResourceV(service, "self.xml", "/test-self/self::document-node()", 0); + queryResourceV(service, "self.xml", "/test-self/self::node()", 1); + queryResourceV(service, "self.xml", "/test-self/self::attribute()", 0); + queryResourceV(service, "self.xml", "/test-self/self::element()", 1); + queryResourceV(service, "self.xml", "/test-self/self::comment()", 0); + queryResourceV(service, "self.xml", "/test-self/self::processing-instruction()", 0); + queryResourceV(service, "self.xml", "/test-self/self::text()", 0); + queryResourceV(service, "self.xml", "/test-self/self::namespace-node()", 0); - queryResource(service, "self.xml", "/test-self/*[not(self::a)]", 1); - queryResource(service, "self.xml", "/test-self/*[self::a]", 1); + queryResourceV(service, "self.xml", "/test-self/*[not(self::a)]", 1); + queryResourceV(service, "self.xml", "/test-self/*[self::a]", 1); - queryResource(service, "self.xml", "/self::document-node()", 1); - queryResource(service, "self.xml", "/self::node()", 1); - queryResource(service, "self.xml", "/self::attribute()", 0); - queryResource(service, "self.xml", "/self::element()", 0); - queryResource(service, "self.xml", "/self::comment()", 0); - queryResource(service, "self.xml", "/self::processing-instruction()", 0); - queryResource(service, "self.xml", "/self::text()", 0); - queryResource(service, "self.xml", "/self::namespace-node()", 0); + queryResourceV(service, "self.xml", "/self::document-node()", 1); + queryResourceV(service, "self.xml", "/self::node()", 1); + queryResourceV(service, "self.xml", "/self::attribute()", 0); + queryResourceV(service, "self.xml", "/self::element()", 0); + queryResourceV(service, "self.xml", "/self::comment()", 0); + queryResourceV(service, "self.xml", "/self::processing-instruction()", 0); + queryResourceV(service, "self.xml", "/self::text()", 0); + queryResourceV(service, "self.xml", "/self::namespace-node()", 0); } @Test @@ -556,17 +612,17 @@ public void ancestorAxis() throws XMLDBException { storeXMLStringAndGetQueryService("nested3.xml", nested3); // test ancestor axis with positional predicate - queryResource(service, "nested3.xml", "//a[ancestor::a[2]/t = '1']", 1); - queryResource(service, "nested3.xml", "//a[ancestor::*[2]/t = '1']", 1); - queryResource(service, "nested3.xml", "//a[ancestor::a[1]/t = '2']", 1); - queryResource(service, "nested3.xml", "//a[ancestor::*[1]/t = '2']", 1); - queryResource(service, "nested3.xml", "//a[ancestor-or-self::*[3]/t = '1']", 1); - queryResource(service, "nested3.xml", "//a[ancestor-or-self::a[3]/t = '1']", 1); + queryResourceV(service, "nested3.xml", "//a[ancestor::a[2]/t = '1']", 1); + queryResourceV(service, "nested3.xml", "//a[ancestor::*[2]/t = '1']", 1); + queryResourceV(service, "nested3.xml", "//a[ancestor::a[1]/t = '2']", 1); + queryResourceV(service, "nested3.xml", "//a[ancestor::*[1]/t = '2']", 1); + queryResourceV(service, "nested3.xml", "//a[ancestor-or-self::*[3]/t = '1']", 1); + queryResourceV(service, "nested3.xml", "//a[ancestor-or-self::a[3]/t = '1']", 1); // Following test fails // queryResource(service, "nested3.xml", "//a[ancestor-or-self::*[2]/t = '2']", 1); - queryResource(service, "nested3.xml", "//a[ancestor-or-self::a[2]/t = '2']", 1); - queryResource(service, "nested3.xml", "//a[t = '3'][ancestor-or-self::a[3]/t = '1']", 1); - queryResource(service, "nested3.xml", "//a[t = '3'][ancestor-or-self::*[3]/t = '1']", 1); + queryResourceV(service, "nested3.xml", "//a[ancestor-or-self::a[2]/t = '2']", 1); + queryResourceV(service, "nested3.xml", "//a[t = '3'][ancestor-or-self::a[3]/t = '1']", 1); + queryResourceV(service, "nested3.xml", "//a[t = '3'][ancestor-or-self::*[3]/t = '1']", 1); } @Test @@ -574,12 +630,12 @@ public void ancestorIndex() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService("nested2.xml", nested2); - queryResource(service, "nested2.xml", "//ChildB/ancestor::*[1]/self::ChildA", 1); - queryResource(service, "nested2.xml", "//ChildB/ancestor::*[2]/self::RootElement", 1); - queryResource(service, "nested2.xml", "//ChildB/ancestor::*[position() = 1]/self::ChildA", 1); - queryResource(service, "nested2.xml", "//ChildB/ancestor::*[position() = 2]/self::RootElement", 1); - queryResource(service, "nested2.xml", "//ChildB/ancestor::*[position() = 2]/self::RootElement", 1); - queryResource(service, "nested2.xml", "(, , )/ancestor::*", 0); + queryResourceV(service, "nested2.xml", "//ChildB/ancestor::*[1]/self::ChildA", 1); + queryResourceV(service, "nested2.xml", "//ChildB/ancestor::*[2]/self::RootElement", 1); + queryResourceV(service, "nested2.xml", "//ChildB/ancestor::*[position() = 1]/self::ChildA", 1); + queryResourceV(service, "nested2.xml", "//ChildB/ancestor::*[position() = 2]/self::RootElement", 1); + queryResourceV(service, "nested2.xml", "//ChildB/ancestor::*[position() = 2]/self::RootElement", 1); + queryResourceV(service, "nested2.xml", "(, , )/ancestor::*", 0); } @Test @@ -589,61 +645,95 @@ public void precedingSiblingAxis_persistent() throws XMLDBException, IOException service.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); service.setProperty(OutputKeys.INDENT, "no"); - ResourceSet result = queryResource(service, "siblings.xml", "//a[preceding-sibling::*[1]/s = 'B']", 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo(" Z 4 ")); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "//a[preceding-sibling::*[1]/s = 'B']", 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo(" Z 4 ")); + } + } - result = queryResource(service, "siblings.xml", "//a[preceding-sibling::a[1]/s = 'B']", 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo(" Z 4 ")); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "//a[preceding-sibling::a[1]/s = 'B']", 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo(" Z 4 ")); + } + } - result = queryResource(service, "siblings.xml", "//a[preceding-sibling::*[2]/s = 'B']", 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo(" C 5 ")); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "//a[preceding-sibling::*[2]/s = 'B']", 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo(" C 5 ")); + } + } - result = queryResource(service, "siblings.xml", "//a[preceding-sibling::a[2]/s = 'B']", 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo(" C 5 ")); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "//a[preceding-sibling::a[2]/s = 'B']", 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo(" C 5 ")); + } + } - result = queryResource(service, "siblings.xml", "/test/preceding-sibling::node()", 2); - assertEquals("", result.getResource(0).getContent().toString()); - assertEquals("", result.getResource(1).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "/test/preceding-sibling::node()", 2)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("", resource.getContent().toString()); + } + } - queryResource(service, "siblings.xml", "/node()[1]/preceding-sibling::node()", 0); + queryResourceV(service, "siblings.xml", "/node()[1]/preceding-sibling::node()", 0); - result = queryResource(service, "siblings.xml", "/node()[2]/preceding-sibling::node()", 1); - assertEquals("", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "/node()[2]/preceding-sibling::node()", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } - result = queryResource(service, "siblings.xml", "/node()[3]/preceding-sibling::node()", 2); - assertEquals("", result.getResource(0).getContent().toString()); - assertEquals("", result.getResource(1).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "/node()[3]/preceding-sibling::node()", 2)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("", resource.getContent().toString()); + } + } - queryResource(service, "siblings.xml", "/comment()[1]/preceding-sibling::comment()", 0); + queryResourceV(service, "siblings.xml", "/comment()[1]/preceding-sibling::comment()", 0); - result = queryResource(service, "siblings.xml", "/comment()[2]/preceding-sibling::comment()[1]", 1); - assertEquals("", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "/comment()[2]/preceding-sibling::comment()[1]", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } - result = queryResource(service, "siblings.xml", "/comment()[3]/preceding-sibling::comment()[1]", 1); - assertEquals("", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "/comment()[3]/preceding-sibling::comment()[1]", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } - result = queryResource(service, "siblings.xml", "/comment()[3]/preceding-sibling::comment()[2]", 1); - assertEquals("", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "/comment()[3]/preceding-sibling::comment()[2]", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } service = storeXMLStringAndGetQueryService("siblings_attr.xml", siblings_attr); service.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); service.setProperty(OutputKeys.INDENT, "no"); - queryResource(service, "siblings_attr.xml", "/a/@bb/preceding-sibling::*", 0); + queryResourceV(service, "siblings_attr.xml", "/a/@bb/preceding-sibling::*", 0); service = storeXMLStringAndGetQueryService("siblings_named1.xml", siblings_named1); service.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); service.setProperty(OutputKeys.INDENT, "no"); - queryResource(service, "siblings_named1.xml", "//y[@n eq '2']/preceding-sibling::*:y", 1); - queryResource(service, "siblings_named1.xml", "//y[@n eq '2']/preceding-sibling::y", 1); + queryResourceV(service, "siblings_named1.xml", "//y[@n eq '2']/preceding-sibling::*:y", 1); + queryResourceV(service, "siblings_named1.xml", "//y[@n eq '2']/preceding-sibling::y", 1); service = storeXMLStringAndGetQueryService("siblings_named2.xml", siblings_named2); service.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); service.setProperty(OutputKeys.INDENT, "no"); - queryResource(service, "siblings_named2.xml", "//y[@n eq '2']/preceding-sibling::*:y", 1); - queryResource(service, "siblings_named2.xml", "//y[@n eq '2']/preceding-sibling::y", 1); + queryResourceV(service, "siblings_named2.xml", "//y[@n eq '2']/preceding-sibling::*:y", 1); + queryResourceV(service, "siblings_named2.xml", "//y[@n eq '2']/preceding-sibling::y", 1); } @Test @@ -652,56 +742,89 @@ public void precedingSiblingAxis_memtree() throws XMLDBException, IOException, S service.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); service.setProperty(OutputKeys.INDENT, "no"); - ResourceSet rs = service.query("(, , )/preceding-sibling::*"); - assertEquals(0, rs.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(, , )/preceding-sibling::*")) { + assertEquals(0, result.getSize()); + } - rs = service.query("let $doc :=
" + - "return $doc/div/preceding-sibling::div"); - assertEquals(3, rs.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc :=
" + + "return $doc/div/preceding-sibling::div")) { + assertEquals(3, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("
")); + } + try (final Resource resource = result.getResource(1)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("
")); + } + try (final Resource resource = result.getResource(2)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("
")); + } + } - assertThat(rs.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("
")); - assertThat(rs.getResource(1).getContent().toString(), CompareMatcher.isIdenticalTo("
")); - assertThat(rs.getResource(2).getContent().toString(), CompareMatcher.isIdenticalTo("
")); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { ,,, } return $doc/node()[1]/preceding-sibling::node()")) { + assertEquals(0, result.getSize()); + } - rs = service.query("let $doc := document { ,,, } return $doc/node()[1]/preceding-sibling::node()"); - assertEquals(0, rs.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { ,,, } return $doc/node()[2]/preceding-sibling::node()")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } - rs = service.query("let $doc := document { ,,, } return $doc/node()[2]/preceding-sibling::node()"); - assertEquals(1, rs.getSize()); - assertEquals("", rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { ,,, } return $doc/node()[3]/preceding-sibling::node()")) { + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("", resource.getContent().toString()); + } + } - rs = service.query("let $doc := document { ,,, } return $doc/node()[3]/preceding-sibling::node()"); - assertEquals(2, rs.getSize()); - assertEquals("", rs.getResource(0).getContent().toString()); - assertEquals("", rs.getResource(1).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { ,,, } return $doc/comment()[1]/preceding-sibling::comment()")) { + assertEquals(0, result.getSize()); + } - rs = service.query("let $doc := document { ,,, } return $doc/comment()[1]/preceding-sibling::comment()"); - assertEquals(0, rs.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { ,,, } return $doc/comment()[2]/preceding-sibling::comment()[1]")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } - rs = service.query("let $doc := document { ,,, } return $doc/comment()[2]/preceding-sibling::comment()[1]"); - assertEquals(1, rs.getSize()); - assertEquals("", rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { ,,, } return $doc/comment()[3]/preceding-sibling::comment()[1]")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } - rs = service.query("let $doc := document { ,,, } return $doc/comment()[3]/preceding-sibling::comment()[1]"); - assertEquals(1, rs.getSize()); - assertEquals("", rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { ,,, } return $doc/comment()[3]/preceding-sibling::comment()[2]")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } - rs = service.query("let $doc := document { ,,, } return $doc/comment()[3]/preceding-sibling::comment()[2]"); - assertEquals(1, rs.getSize()); - assertEquals("", rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $elem := return $elem/@bb/preceding-sibling::*")) { + assertEquals(0, result.getSize()); + } - rs = service.query("let $elem := return $elem/@bb/preceding-sibling::*"); - assertEquals(0, rs.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { } return $doc //y[@n eq '2']/preceding-sibling::*:y")) { + assertEquals(1, result.getSize()); + } - rs = service.query("let $doc := document { } return $doc //y[@n eq '2']/preceding-sibling::*:y"); - assertEquals(1, rs.getSize()); - rs = service.query("let $doc := document { } return $doc //y[@n eq '2']/preceding-sibling::y"); - assertEquals(1, rs.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { } return $doc //y[@n eq '2']/preceding-sibling::y")) { + assertEquals(1, result.getSize()); + } - rs = service.query("let $doc := document { } return $doc //y[@n eq '2']/preceding-sibling::*:y"); - assertEquals(1, rs.getSize()); - rs = service.query("let $doc := document { } return $doc //y[@n eq '2']/preceding-sibling::y"); - assertEquals(1, rs.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { } return $doc //y[@n eq '2']/preceding-sibling::*:y")) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { } return $doc //y[@n eq '2']/preceding-sibling::y")) { + assertEquals(1, result.getSize()); + } } @Test @@ -710,53 +833,81 @@ public void followingSiblingAxis_persistent() throws XMLDBException, IOException service.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); service.setProperty(OutputKeys.INDENT, "no"); - ResourceSet result = queryResource(service, "siblings.xml", "//a[following-sibling::*[1]/s = 'B']", 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo(" Z 2 ")); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "//a[following-sibling::*[1]/s = 'B']", 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo(" Z 2 ")); + } + } - result = queryResource(service, "siblings.xml", "//a[following-sibling::a[1]/s = 'B']", 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo(" Z 2 ")); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "//a[following-sibling::a[1]/s = 'B']", 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo(" Z 2 ")); + } + } - result = queryResource(service, "siblings.xml", "//a[following-sibling::*[2]/s = 'B']", 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo(" A 1 ")); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "//a[following-sibling::*[2]/s = 'B']", 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo(" A 1 ")); + } + } - result = queryResource(service, "siblings.xml", "//a[following-sibling::a[2]/s = 'B']", 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo(" A 1 ")); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "//a[following-sibling::a[2]/s = 'B']", 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo(" A 1 ")); + } + } - result = queryResource(service, "siblings.xml", "/test/following-sibling::node()", 1); - assertEquals("", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "/test/following-sibling::node()", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } - result = queryResource(service, "siblings.xml", "/node()[1]/following-sibling::node()", 3); - assertEquals("", result.getResource(0).getContent().toString()); - final Node testElem = ((XMLResource)result.getResource(1)).getContentAsDOM(); - assertTrue(testElem instanceof Element); - assertEquals("test", testElem.getNodeName()); - assertEquals("", result.getResource(2).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "/node()[1]/following-sibling::node()", 3)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + try (final XMLResource resource = (XMLResource) result.getResource(1)) { + final Node testElem = resource.getContentAsDOM(); + assertTrue(testElem instanceof Element); + assertEquals("test", testElem.getNodeName()); + } + try (final Resource resource = result.getResource(2)) { + assertEquals("", resource.getContent().toString()); + } + } - result = queryResource(service, "siblings.xml", "/comment()[1]/following-sibling::comment()[1]", 1); - assertEquals("", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "/comment()[1]/following-sibling::comment()[1]", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } - result = queryResource(service, "siblings.xml", "/comment()[1]/following-sibling::comment()[2]", 1); - assertEquals("", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "/comment()[1]/following-sibling::comment()[2]", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } service = storeXMLStringAndGetQueryService("siblings_attr.xml", siblings_attr); service.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); service.setProperty(OutputKeys.INDENT, "no"); - queryResource(service, "siblings_attr.xml", "/a/@b/following-sibling::*", 0); + queryResourceV(service, "siblings_attr.xml", "/a/@b/following-sibling::*", 0); service = storeXMLStringAndGetQueryService("siblings_named1.xml", siblings_named1); service.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); service.setProperty(OutputKeys.INDENT, "no"); - queryResource(service, "siblings_named1.xml", "//y[@n eq '2']/following-sibling::*:y", 1); - queryResource(service, "siblings_named1.xml", "//y[@n eq '2']/following-sibling::y", 1); + queryResourceV(service, "siblings_named1.xml", "//y[@n eq '2']/following-sibling::*:y", 1); + queryResourceV(service, "siblings_named1.xml", "//y[@n eq '2']/following-sibling::y", 1); service = storeXMLStringAndGetQueryService("siblings_named2.xml", siblings_named2); service.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); service.setProperty(OutputKeys.INDENT, "no"); - queryResource(service, "siblings_named2.xml", "//y[@n eq '2']/following-sibling::*:y", 1); - queryResource(service, "siblings_named2.xml", "//y[@n eq '2']/following-sibling::y", 1); + queryResourceV(service, "siblings_named2.xml", "//y[@n eq '2']/following-sibling::*:y", 1); + queryResourceV(service, "siblings_named2.xml", "//y[@n eq '2']/following-sibling::y", 1); } @Test @@ -765,44 +916,71 @@ public void followingSiblingAxis_memtree() throws XMLDBException, IOException, S service.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); service.setProperty(OutputKeys.INDENT, "no"); - ResourceSet rs = service.query("(, , )/following-sibling::*"); - assertEquals(0, rs.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("(, , )/following-sibling::*")) { + assertEquals(0, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc :=
" + + "return $doc/div[1]/following-sibling::div")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("
")); + } + } - rs = service.query("let $doc :=
" + - "return $doc/div[1]/following-sibling::div"); - assertEquals(1, rs.getSize()); - assertThat(rs.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("
")); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { ,,, } return $doc/test/following-sibling::node()")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } - rs = service.query("let $doc := document { ,,, } return $doc/test/following-sibling::node()"); - assertEquals(1, rs.getSize()); - assertEquals("", rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { ,,, } return $doc/node()[1]/following-sibling::node()")) { + assertEquals(3, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + try (final Resource resource = result.getResource(2)) { + assertEquals("", resource.getContent().toString()); + } + } + + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { ,,, } return $doc/comment()[1]/following-sibling::comment()[1]")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } - rs = service.query("let $doc := document { ,,, } return $doc/node()[1]/following-sibling::node()"); - assertEquals(3, rs.getSize()); - assertEquals("", rs.getResource(0).getContent().toString()); - assertThat(rs.getResource(1).getContent().toString(), CompareMatcher.isIdenticalTo("")); - assertEquals("", rs.getResource(2).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { ,,, } return $doc/comment()[1]/following-sibling::comment()[2]")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } - rs = service.query("let $doc := document { ,,, } return $doc/comment()[1]/following-sibling::comment()[1]"); - assertEquals(1, rs.getSize()); - assertEquals("", rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $elem := return $elem/@b/following-sibling::*")) { + assertEquals(0, result.getSize()); + } - rs = service.query("let $doc := document { ,,, } return $doc/comment()[1]/following-sibling::comment()[2]"); - assertEquals(1, rs.getSize()); - assertEquals("", rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { } return $doc //y[@n eq '2']/following-sibling::*:y")) { + assertEquals(1, result.getSize()); + } - rs = service.query("let $elem := return $elem/@b/following-sibling::*"); - assertEquals(0, rs.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { } return $doc //y[@n eq '2']/following-sibling::y")) { + assertEquals(1, result.getSize()); + } - rs = service.query("let $doc := document { } return $doc //y[@n eq '2']/following-sibling::*:y"); - assertEquals(1, rs.getSize()); - rs = service.query("let $doc := document { } return $doc //y[@n eq '2']/following-sibling::y"); - assertEquals(1, rs.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { } return $doc //y[@n eq '2']/following-sibling::*:y")) { + assertEquals(1, result.getSize()); + } - rs = service.query("let $doc := document { } return $doc //y[@n eq '2']/following-sibling::*:y"); - assertEquals(1, rs.getSize()); - rs = service.query("let $doc := document { } return $doc //y[@n eq '2']/following-sibling::y"); - assertEquals(1, rs.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document { } return $doc //y[@n eq '2']/following-sibling::y")) { + assertEquals(1, result.getSize()); + } } @Test @@ -812,13 +990,19 @@ public void followingAxis() throws XMLDBException, IOException, SAXException { service.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); service.setProperty(OutputKeys.INDENT, "no"); - queryResource(service, "siblings.xml", "//a/s[. = 'B']/following::s", 3); - queryResource(service, "siblings.xml", "//a/s[. = 'B']/following::n", 4); - ResourceSet result = queryResource(service, "siblings.xml", "//a/s[. = 'B']/following::s[1]", 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("Z")); + queryResourceV(service, "siblings.xml", "//a/s[. = 'B']/following::s", 3); + queryResourceV(service, "siblings.xml", "//a/s[. = 'B']/following::n", 4); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "//a/s[. = 'B']/following::s[1]", 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("Z")); + } + } - result = queryResource(service, "siblings.xml", "//a/s[. = 'B']/following::s[2]", 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("C")); + try (final EXistResourceSet result = queryResource(service, "siblings.xml", "//a/s[. = 'B']/following::s[2]", 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("C")); + } + } String query = "declare variable $i := \n" + " \n" + @@ -835,13 +1019,24 @@ public void followingAxis() throws XMLDBException, IOException, SAXException { "\n" + "root($i)//following::node()"; - result = service.query(query); - assertEquals(5, result.getSize()); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("")); - assertThat(result.getResource(1).getContent().toString(), CompareMatcher.isIdenticalTo("")); - assertThat(result.getResource(2).getContent().toString(), CompareMatcher.isIdenticalTo("")); - assertThat(result.getResource(3).getContent().toString(), CompareMatcher.isIdenticalTo("")); - assertThat(result.getResource(4).getContent().toString(), CompareMatcher.isIdenticalTo("")); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(5, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + try (final Resource resource = result.getResource(1)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + try (final Resource resource = result.getResource(2)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + try (final Resource resource = result.getResource(3)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + try (final Resource resource = result.getResource(4)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } query = "declare variable $i := \n" + " \n" + @@ -858,15 +1053,30 @@ public void followingAxis() throws XMLDBException, IOException, SAXException { "\n" + "root($i)//count(following::node())"; - result = service.query(query); - assertEquals(7, result.getSize()); - assertEquals("0", result.getResource(0).getContent()); - assertEquals("5", result.getResource(1).getContent()); - assertEquals("4", result.getResource(2).getContent()); - assertEquals("0", result.getResource(3).getContent()); - assertEquals("0", result.getResource(4).getContent()); - assertEquals("0", result.getResource(5).getContent()); - assertEquals("0", result.getResource(6).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(7, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("0", resource.getContent()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("5", resource.getContent()); + } + try (final Resource resource = result.getResource(2)) { + assertEquals("4", resource.getContent()); + } + try (final Resource resource = result.getResource(3)) { + assertEquals("0", resource.getContent()); + } + try (final Resource resource = result.getResource(4)) { + assertEquals("0", resource.getContent()); + } + try (final Resource resource = result.getResource(5)) { + assertEquals("0", resource.getContent()); + } + try (final Resource resource = result.getResource(6)) { + assertEquals("0", resource.getContent()); + } + } } @Test @@ -875,87 +1085,104 @@ public void precedingAxis() throws XMLDBException { storeXMLStringAndGetQueryService("siblings.xml", siblings); service.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); service.setProperty(OutputKeys.INDENT, "no"); - queryResource(service, "siblings.xml", "//a/s[. = 'B']/preceding::s", 2); - queryResource(service, "siblings.xml", "//a/s[. = 'C']/preceding::s", 4); - queryResource(service, "siblings.xml", "//a/n[. = '3']/preceding::s", 3); + queryResourceV(service, "siblings.xml", "//a/s[. = 'B']/preceding::s", 2); + queryResourceV(service, "siblings.xml", "//a/s[. = 'C']/preceding::s", 4); + queryResourceV(service, "siblings.xml", "//a/n[. = '3']/preceding::s", 3); } @Test public void position() throws XMLDBException, IOException, SAXException { - final XQueryService service = storeXMLStringAndGetQueryService("numbers.xml", numbers); - queryResource(service, "numbers.xml", "//item[position() = 3]", 1); - queryResource(service, "numbers.xml", "//item[position() < 3]", 2); - queryResource(service, "numbers.xml", "//item[position() <= 3]", 3); - queryResource(service, "numbers.xml", "//item[position() > 3]", 1); - queryResource(service, "numbers.xml", "//item[position() >= 3]", 2); - queryResource(service, "numbers.xml", "//item[position() eq 3]", 1); - queryResource(service, "numbers.xml", "//item[position() lt 3]", 2); - queryResource(service, "numbers.xml", "//item[position() le 3]", 3); - queryResource(service, "numbers.xml", "//item[position() gt 3]", 1); - queryResource(service, "numbers.xml", "//item[position() ge 3]", 2); + queryResourceV(service, "numbers.xml", "//item[position() = 3]", 1); + queryResourceV(service, "numbers.xml", "//item[position() < 3]", 2); + queryResourceV(service, "numbers.xml", "//item[position() <= 3]", 3); + queryResourceV(service, "numbers.xml", "//item[position() > 3]", 1); + queryResourceV(service, "numbers.xml", "//item[position() >= 3]", 2); + queryResourceV(service, "numbers.xml", "//item[position() eq 3]", 1); + queryResourceV(service, "numbers.xml", "//item[position() lt 3]", 2); + queryResourceV(service, "numbers.xml", "//item[position() le 3]", 3); + queryResourceV(service, "numbers.xml", "//item[position() gt 3]", 1); + queryResourceV(service, "numbers.xml", "//item[position() ge 3]", 2); - queryResource(service, "numbers.xml", "//item[last() - 1]", 1); - queryResource(service, "numbers.xml", "//item[count(('a','b')) - 1]", 1); + queryResourceV(service, "numbers.xml", "//item[last() - 1]", 1); + queryResourceV(service, "numbers.xml", "//item[count(('a','b')) - 1]", 1); String query = "for $a in (, , ) return $a/position()"; - ResourceSet result = service.queryResource("numbers.xml", query); - assertEquals("XPath: " + query, 3, result.getSize()); - XMLResource resource = (XMLResource)result.getResource(0); - assertEquals("XPath: " + query, "1", resource.getContent().toString()); - resource = (XMLResource)result.getResource(1); - assertEquals("XPath: " + query, "1", resource.getContent().toString()); - resource = (XMLResource)result.getResource(2); - assertEquals("XPath: " + query, "1", resource.getContent().toString()); - + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query)) { + assertEquals("XPath: " + query, 3, result.getSize()); + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XPath: " + query, "1", resource.getContent().toString()); + } + try (final XMLResource resource = (XMLResource) result.getResource(1)) { + assertEquals("XPath: " + query, "1", resource.getContent().toString()); + } + try (final XMLResource resource = (XMLResource) result.getResource(2)) { + assertEquals("XPath: " + query, "1", resource.getContent().toString()); + } + } query = "declare variable $doc := " + "1234567" + "; " + "(for $x in $doc/a return $x)[position() mod 3 = 2]"; - result = service.queryResource("numbers.xml", query); - assertEquals("XPath: " + query, 2, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query)) { + assertEquals("XPath: " + query, 2, result.getSize()); + } query = "declare variable $doc := " + "1234567" + "; " + "for $x in $doc/a return $x[position() mod 3 = 2]"; - result = service.queryResource("numbers.xml", query); - assertEquals("XPath: " + query, 0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query)) { + assertEquals("XPath: " + query, 0, result.getSize()); + } query = "declare variable $doc := " + "1234567" + "; " + "for $x in $doc/a[position() mod 3 = 2] return $x"; - result = service.queryResource("numbers.xml", query); - assertEquals("XPath: " + query, 2, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query)) { + assertEquals("XPath: " + query, 2, result.getSize()); + } query = "let $test := a a" + "return distinct-values($test/a/normalize-space(.))"; - result = service.queryResource("numbers.xml", query); - assertEquals("XPath: " + query, 1, result.getSize()); - resource = (XMLResource)result.getResource(0); - assertEquals("XPath: " + query, "a", resource.getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XPath: " + query, "a", resource.getContent().toString()); + } + } query = "let $doc := document {} " + "return $doc//b/(if (@n = '1') then position() else ())"; - result = service.queryResource("numbers.xml", query); - assertEquals("XPath: " + query, 1, result.getSize()); - assertEquals("1", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent().toString()); + } + } + //Try a second time to see if the position is reset - result = service.queryResource("numbers.xml", query); - assertEquals("XPath: " + query, 1, result.getSize()); - assertEquals("1", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent().toString()); + } + } query = "let $doc := document {} " + "return $doc/a[1] [b[1]]"; service.setProperty(OutputKeys.INDENT, "no"); - result = service.queryResource("numbers.xml", query); - assertEquals("XPath: " + query, 1, result.getSize()); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("")); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query)) { + assertEquals("XPath: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } //TODO : make this work ! It currently returns some content //query = "let $doc := document {1a} " + @@ -975,12 +1202,15 @@ public void last() throws XMLDBException { storeXMLStringAndGetQueryService("numbers.xml", numbers); final String query = "test1test2/b/last()"; - final ResourceSet result = service.queryResource("numbers.xml", query); - assertEquals("XPath: " + query, 2, result.getSize()); - XMLResource resource = (XMLResource)result.getResource(0); - assertEquals("XPath: " + query, "2", resource.getContent().toString()); - resource = (XMLResource)result.getResource(1); - assertEquals("XPath: " + query, "2", resource.getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query)) { + assertEquals("XPath: " + query, 2, result.getSize()); + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XPath: " + query, "2", resource.getContent().toString()); + } + try (final XMLResource resource = (XMLResource) result.getResource(1)) { + assertEquals("XPath: " + query, "2", resource.getContent().toString()); + } + } } @@ -989,26 +1219,38 @@ public void numbers() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService("numbers.xml", numbers); - ResourceSet result = queryResource(service, "numbers.xml", "sum(/test/item/price)", 1); - assertEquals("96.94", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "sum(/test/item/price)", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("96.94", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "round(sum(/test/item/price))", 1); - assertEquals("97", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "round(sum(/test/item/price))", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("97", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "floor(sum(/test/item/stock))", 1); - assertEquals( "86", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "floor(sum(/test/item/stock))", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("86", resource.getContent().toString()); + } + } - queryResource(service, "numbers.xml", "/test/item[round(price + 3) > 60]", 1); + queryResourceV(service, "numbers.xml", "/test/item[round(price + 3) > 60]", 1); - result = queryResource(service, "numbers.xml", "min(( 123456789123456789123456789, " + - "123456789123456789123456789123456789123456789 ))", 1); - assertEquals("minimum of big integers", - "123456789123456789123456789", - result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "min(( 123456789123456789123456789, " + + "123456789123456789123456789123456789123456789 ))", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("minimum of big integers", + "123456789123456789123456789", + resource.getContent().toString()); + } + } String message = ""; try { - queryResource(service, "numbers.xml", "empty(() + (1, 2))", 1); + queryResourceV(service, "numbers.xml", "empty(() + (1, 2))", 1); } catch (XMLDBException e) { message = e.getMessage(); } @@ -1021,21 +1263,23 @@ public void dates() throws XMLDBException { storeXMLStringAndGetQueryService("numbers.xml", numbers); String query = "xs:untypedAtomic(\"--12-05:00\") cast as xs:gMonth"; - ResourceSet result = service.queryResource("numbers.xml", query); - XMLResource resource = (XMLResource)result.getResource(0); - assertEquals("XPath: " + query, "--12-05:00", resource.getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query); + final XMLResource resource = (XMLResource)result.getResource(0)) { + assertEquals("XPath: " + query, "--12-05:00", resource.getContent().toString()); + } query = "(xs:dateTime(\"0001-01-01T01:01:01Z\") + xs:yearMonthDuration(\"-P20Y07M\"))"; - result = service.queryResource("numbers.xml", query); - resource = (XMLResource)result.getResource(0); - assertEquals("XPath: " + query, "-0021-06-01T01:01:01Z", resource.getContent().toString()); - } + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query); + final XMLResource resource = (XMLResource)result.getResource(0)) { + assertEquals("XPath: " + query, "-0021-06-01T01:01:01Z", resource.getContent().toString()); + } + } @Test public void generalComparison() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService("dates.xml", date); - queryResource(service, "dates.xml", "/timestamp[@date = xs:date('2006-04-29+02:00')]", 1); + queryResourceV(service, "dates.xml", "/timestamp[@date = xs:date('2006-04-29+02:00')]", 1); } @Test @@ -1051,37 +1295,66 @@ public void predicates() throws XMLDBException, IOException, SAXException { final XQueryService service = storeXMLStringAndGetQueryService("numbers.xml", numbers); service.setProperty(OutputKeys.INDENT, "no"); - ResourceSet result = queryResource(service, "numbers.xml", "/test/item[2]/price/text()", 1); - assertEquals("7.4", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "/test/item[2]/price/text()", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("7.4", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "/test/item[5]", 0); + queryResourceV(service, "numbers.xml", "/test/item[5]", 0); - result = queryResource(service, "numbers.xml", "/test/item[@id='4'][1]/price[1]/text()", 1); - assertEquals("65.54", - result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "/test/item[@id='4'][1]/price[1]/text()", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("65.54", + resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "for $i in //item return " + - "{$i/price, $i/stock}", 4); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("5.622")); - assertThat(result.getResource(3).getContent().toString(), CompareMatcher.isIdenticalTo("65.5416")); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "for $i in //item return " + + "{$i/price, $i/stock}", 4)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("5.622")); + } + try (final Resource resource = result.getResource(3)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("65.5416")); + } + } // test positional predicates - result = queryResource(service, "numbers.xml", "/test/node()[2]", 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("7.443")); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "/test/node()[2]", 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("7.443")); + } + } - result = queryResource(service, "numbers.xml", "/test/element()[2]", 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("7.443")); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "/test/element()[2]", 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("7.443")); + } + } // positional predicate on sequence of atomic values - result = queryResource(service, "numbers.xml", "('test', 'pass')[2]", 1); - assertEquals("pass", result.getResource(0).getContent().toString()); - result = queryResource(service, "numbers.xml", "let $credentials := ('test', 'pass') let $user := $credentials[1] return $user", 1); - assertEquals("test", result.getResource(0).getContent().toString()); - result = queryResource(service, "numbers.xml", "let $credentials := ('test', 'pass') let $user := $credentials[2] return $user", 1); - assertEquals("pass", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "('test', 'pass')[2]", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("pass", resource.getContent().toString()); + } + } + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "let $credentials := ('test', 'pass') let $user := $credentials[1] return $user", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("test", resource.getContent().toString()); + } + } + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "let $credentials := ('test', 'pass') let $user := $credentials[2] return $user", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("pass", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "let $els := text1text2 return $els/el[xs:string(.) eq 'text1'] ", 1); - assertEquals("text1", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "let $els := text1text2 return $els/el[xs:string(.) eq 'text1'] ", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("text1", resource.getContent().toString()); + } + } } @Test @@ -1110,59 +1383,85 @@ public void predicates2() throws XMLDBException, IOException, SAXException { "" + "return " + "$t//a[s = 'Z' and preceding-sibling::*[1]/s = 'B']"; - ResourceSet result = queryResource(service, "numbers.xml", query, 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("Z 4 ")); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", query, 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("Z 4 ")); + } + } query = "let $t := " + " A 1 " + " Z 2 " + " B 3 " + " Z 4 " + " C 5 " + " Z 6 " + "" + "return $t//a[s='Z' and ./preceding-sibling::*[1]/s='B']"; - result = queryResource(service, "numbers.xml", query, 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("Z 4 ")); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", query, 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("Z 4 ")); + } + } query = "let $doc := firstsecond" + "firstthird " + "return $doc//rec[fn:not(b = 'second') and (./a = 'first')]"; - result = queryResource(service, "numbers.xml", query, 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("firstthird")); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", query, 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("firstthird")); + } + } query = "let $doc := " + "return $doc/a[$doc/a/@b or $doc/a/@d]"; - result = queryResource(service, "numbers.xml", query, 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("")); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", query, 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } query = "let $x := " + "return $x//b[count(x) = 2]"; - result = queryResource(service, "numbers.xml", query, 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("")); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", query, 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } //Boolean evaluation for "." (atomic sequence) query = "(1,2,3)[xs:decimal(.)]"; - result = queryResource(service, "numbers.xml", query, 3); + queryResourceV(service, "numbers.xml", query, 3); query = "(1,2,3)[number()]"; - result = queryResource(service, "numbers.xml", query, 3); + queryResourceV(service, "numbers.xml", query, 3); - query = " let $c := (,), $i := 1 return $c[$i]"; - result = queryResource(service, "numbers.xml", query, 1); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("")); + query = "let $c := (,), $i := 1 return $c[$i]"; + try (final EXistResourceSet result = queryResource(service, "numbers.xml", query, 1)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } query = "(1,2,3)[position() = last()]"; - result = queryResource(service, "numbers.xml", query, 1); - assertEquals("3", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", query, 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("3", resource.getContent().toString()); + } + } query = "(1,2,3)[max(.)]"; - result = queryResource(service, "numbers.xml", query, 3); + queryResourceV(service, "numbers.xml", query, 3); query = "(1,2,3)[max(.[. gt 1])]"; - result = queryResource(service, "numbers.xml", query, 2); - assertEquals("2", result.getResource(0).getContent().toString()); - assertEquals("3", result.getResource(1).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", query, 2)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("2", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("3", resource.getContent().toString()); + } + } query = "(1,2,3)[.]"; - result = queryResource(service, "numbers.xml", query, 3); + queryResourceV(service, "numbers.xml", query, 3); query = "declare function local:f ($n) { " + "$n " + @@ -1187,12 +1486,23 @@ public void predicates2() throws XMLDBException, IOException, SAXException { "} ; " + " " + "local:f(1),local:g(1), local:h(1), local:j(1), local:k(1) "; - result = queryResource(service, "numbers.xml", query, 5); - assertEquals("1", result.getResource(0).getContent().toString()); - assertEquals("Fine", result.getResource(1).getContent().toString()); - assertEquals("OK", result.getResource(2).getContent().toString()); - assertEquals("Fine", result.getResource(3).getContent().toString()); - assertEquals("Fine", result.getResource(4).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", query, 5)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("Fine", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(2)) { + assertEquals("OK", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(3)) { + assertEquals("Fine", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(4)) { + assertEquals("Fine", resource.getContent().toString()); + } + } //The collection doesn't exist : let's see how the query behaves with empty sequences query = "let $checkDate := xs:date(adjust-date-to-timezone(current-date(), ())) " + @@ -1201,118 +1511,141 @@ public void predicates2() throws XMLDBException, IOException, SAXException { "$collection//Lease/Events/Type/Event[(When/Date<=$checkDate or " + "When/EstimateDate<=$checkDate) and not(Status='Complete')] " + "return $x"; - result = queryResource(service, "numbers.xml", query, 0); + queryResourceV(service, "numbers.xml", query, 0); query = "let $res := " + "return " + "for $name in ('A', 'B') return " + "$res/element[@name=$name][1]"; - result = queryResource(service, "numbers.xml", query, 2); - - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("")); - assertThat(result.getResource(1).getContent().toString(), CompareMatcher.isIdenticalTo("")); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", query, 2)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + try (final Resource resource = result.getResource(1)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } } /** - * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1460610&group_id=17691&atid=117691 + * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1460610&group_id=17691&atid=117691 */ @Test public void predicates_bug1460610() throws XMLDBException { final String xQuery = "(1, 2, 3)[ . lt 3]"; final XQueryService service = getQueryService(); - final ResourceSet rs = service.query(xQuery); - - assertEquals("SFBUG 1460610 nr of results", 2, rs.getSize()); - assertEquals("SFBUG 1460610 1st result", "1", - rs.getResource(0).getContent().toString()); - assertEquals("SFBUG 1460610 2nd result", "2", - rs.getResource(1).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + + assertEquals("SFBUG 1460610 nr of results", 2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("SFBUG 1460610 1st result", "1", + resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("SFBUG 1460610 2nd result", "2", + resource.getContent().toString()); + } + } } /** - * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1537355&group_id=17691&atid=117691 + * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1537355&group_id=17691&atid=117691 */ @Test public void predicates_bug1537355() throws XMLDBException { final String xQuery = "let $one := 1 return (1, 2, 3)[$one + 1]"; final XQueryService service = getQueryService(); - final ResourceSet rs = service.query(xQuery); - - assertEquals("SFBUG 1537355 nr of results", 1, rs.getSize()); - assertEquals("SFBUG 1537355 result", "2", - rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + assertEquals("SFBUG 1537355 nr of results", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("SFBUG 1537355 result", "2", + resource.getContent().toString()); + } + } } /** - * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1533053&group_id=17691&atid=117691 + * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1533053&group_id=17691&atid=117691 */ @Test public void nestedPredicates_bug1533053() throws XMLDBException, IOException, SAXException { + final XQueryService service = getQueryService(); + String xQuery = "let $doc := " + "false" + "true" + " " + "let $matches := $doc/detail[source[dynamic='false'] or class] " + "return count($matches) eq 2"; - - XQueryService service = getQueryService(); - ResourceSet rs = service.query(xQuery); - - assertEquals(1, rs.getSize()); - assertEquals("true", rs.getResource(0).getContent().toString()); + + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("true", resource.getContent().toString()); + } + } xQuery = "let $xml := " + "" + " " + "return $xml//element[complexType/attribute[@name eq \"design\"]/@fixed eq \"1\"]"; - service = getQueryService(); service.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); - service.setProperty(OutputKeys.INDENT, "no"); - rs = service.query(xQuery); - - assertEquals(1, rs.getSize()); - assertThat(rs.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("")); + service.setProperty(OutputKeys.INDENT, "no"); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } } /** - * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1488303&group_id=17691&atid=117691 + * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1488303&group_id=17691&atid=117691 */ @Test public void predicate_bug1488303() throws XMLDBException { - XQueryService service = getQueryService(); - ResourceSet rs=null; + final XQueryService service = getQueryService(); // test one final String xQuery1 = "let $q := eXist return $q//t"; - rs = service.query(xQuery1); - assertEquals("nr of results", 1, rs.getSize()); - assertEquals("result", "eXist", - rs.getResource(0).getContent().toString()); - + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery1)) { + assertEquals("nr of results", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("result", "eXist", + resource.getContent().toString()); + } + } + // test two final String xQuery2 = "let $q := eXist return ($q//t)[1]"; - rs = service.query(xQuery2); - assertEquals("nr of results", 1, rs.getSize()); - assertEquals("result", "eXist", - rs.getResource(0).getContent().toString()); - + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery2)) { + assertEquals("nr of results", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("result", "eXist", + resource.getContent().toString()); + } + } + // This one fails http://sourceforge.net/tracker/index.php?func=detail&aid=1488303&group_id=17691&atid=117691 final String xQuery3 = "let $q := eXist return $q//t[1]"; - rs = service.query(xQuery3); - assertEquals("SFBUG 1488303 nr of results", 1, rs.getSize()); - assertEquals("SFBUG 1488303 result", "eXist", - rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery3)) { + assertEquals("SFBUG 1488303 nr of results", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("SFBUG 1488303 result", "eXist", + resource.getContent().toString()); + } + } } /** - * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1460791&group_id=17691&atid=117691 + * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1460791&group_id=17691&atid=117691 */ @Test public void descendantOrSelf_bug1460791() throws XMLDBException { @@ -1320,22 +1653,27 @@ public void descendantOrSelf_bug1460791() throws XMLDBException { +"return ( {$test//z}, {$test/descendant-or-self::node()/child::z} )"; final XQueryService service = getQueryService(); - final ResourceSet rs = service.query(xQuery); - + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + // System.out.println("BUG1460791/1" + rs.getResource(0).getContent().toString() ); // System.out.println("BUG1460791/2" + rs.getResource(1).getContent().toString() ); - - assertEquals("SFBUG 1460791 nr of results", 2, rs.getSize()); - - assertEquals("SFBUG 1460791 result part 1", "zzz", - rs.getResource(0).getContent().toString()); - - assertEquals("SFBUG 1460791 result part 2", "zzz", - rs.getResource(1).getContent().toString()); + + assertEquals("SFBUG 1460791 nr of results", 2, result.getSize()); + + try (final Resource resource = result.getResource(0)) { + assertEquals("SFBUG 1460791 result part 1", "zzz", + resource.getContent().toString()); + } + + try (final Resource resource = result.getResource(1)) { + assertEquals("SFBUG 1460791 result part 2", "zzz", + resource.getContent().toString()); + } + } } /** - * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1462120&group_id=17691&atid=1176 + * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1462120&group_id=17691&atid=1176 */ @Test public void xpath_bug1462120() throws XMLDBException { @@ -1348,18 +1686,25 @@ public void xpath_bug1462120() throws XMLDBException { +"
,$m/Unit[string(data(@name)) eq string(data($one/@aaa))] )"; final XQueryService service = getQueryService(); - final ResourceSet rs = service.query(xQuery); - - assertEquals("SFBUG 1462120 nr of results", 3, rs.getSize()); - - assertEquals("SFBUG 1462120 result part 1", "", - rs.getResource(0).getContent().toString()); - - assertEquals("SFBUG 1462120 result part 2", "
", - rs.getResource(1).getContent().toString()); - - assertEquals("SFBUG 1462120 result part 3", "", - rs.getResource(2).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + + assertEquals("SFBUG 1462120 nr of results", 3, result.getSize()); + + try (final Resource resource = result.getResource(0)) { + assertEquals("SFBUG 1462120 result part 1", "", + resource.getContent().toString()); + } + + try (final Resource resource = result.getResource(1)) { + assertEquals("SFBUG 1462120 result part 2", "
", + resource.getContent().toString()); + } + + try (final Resource resource = result.getResource(2)) { + assertEquals("SFBUG 1462120 result part 3", "", + resource.getContent().toString()); + } + } } @@ -1367,18 +1712,21 @@ public void xpath_bug1462120() throws XMLDBException { * In Predicate.java, the contextSet and the outerSequence.toNodeSet() * documents are different so that no match can occur. * - * @see http://wiki.exist-db.org/space/XQueryBugs + * @see http://wiki.exist-db.org/space/XQueryBugs */ @Test public void predicate_bug_wiki_1() throws XMLDBException { final String xQuery = "let $dum := 12 return $dum/el[2]"; final XQueryService service = getQueryService(); - final ResourceSet rs = service.query(xQuery); - - assertEquals("Predicate bug wiki_1", 1, rs.getSize()); - assertEquals("Predicate bug wiki_1", "2", - rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + + assertEquals("Predicate bug wiki_1", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("Predicate bug wiki_1", "2", + resource.getContent().toString()); + } + } } @Test @@ -1387,14 +1735,17 @@ public void predicate_bug_andrzej() throws XMLDBException { "doc('/db/test/predicates.xml')//elem1/elem2[ string-length( ./elem3 ) > 0][1]/elem3/text()"; final XQueryService service = storeXMLStringAndGetQueryService("predicates.xml", predicates); - final ResourceSet rs = service.query(xQuery); - assertEquals("testPredicateBUGAndrzej", 1, rs.getSize()); - assertEquals("testPredicateBUGAndrzej", "val1", rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + assertEquals("testPredicateBUGAndrzej", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("testPredicateBUGAndrzej", "val1", resource.getContent().toString()); + } + } } /** * removing Self: makes the query work OK - * @see http://wiki.exist-db.org/space/XQueryBugs + * @see http://wiki.exist-db.org/space/XQueryBugs */ @Test public void cardinalitySelf_bug_wiki_2() throws XMLDBException { @@ -1402,18 +1753,19 @@ public void cardinalitySelf_bug_wiki_2() throws XMLDBException { + "for $h in $test/works/employee[2] return fn:name($h/self::employee)"; final XQueryService service = getQueryService(); - final ResourceSet rs = service.query(xQuery); - - assertEquals("CardinalitySelfBUG bug wiki_2", 1, rs.getSize()); - assertEquals("CardinalitySelfBUG bug wiki_2", "employee", - rs.getResource(0).getContent().toString()); - + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + assertEquals("CardinalitySelfBUG bug wiki_2", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("CardinalitySelfBUG bug wiki_2", "employee", + resource.getContent().toString()); + } + } } /** * Problem in VirtualNodeSet which return 2 attributes because it * computes every level - * @see http://wiki.exist-db.org/space/XQueryBugs + * @see http://wiki.exist-db.org/space/XQueryBugs */ @Test public void virtualNodeset_bug_wiki_3() throws XMLDBException { @@ -1422,17 +1774,20 @@ public void virtualNodeset_bug_wiki_3() throws XMLDBException { + "/descendant::*/attribute::id return {$node}"; final XQueryService service = getQueryService(); - final ResourceSet rs = service.query(xQuery); - - assertEquals("VirtualNodesetBUG_wiki_3", 1, rs.getSize()); - assertEquals("VirtualNodesetBUG_wiki_3", "", - rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + + assertEquals("VirtualNodesetBUG_wiki_3", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("VirtualNodesetBUG_wiki_3", "", + resource.getContent().toString()); + } + } } /** * Problem in VirtualNodeSet because it computes the wrong level * - * @see http://wiki.exist-db.org/space/XQueryBugs + * @see http://wiki.exist-db.org/space/XQueryBugs */ @Test public void virtualNodeset_bug_wiki_4() throws XMLDBException { @@ -1442,17 +1797,19 @@ public void virtualNodeset_bug_wiki_4() throws XMLDBException { + "return {$node}"; final XQueryService service = getQueryService(); - final ResourceSet rs = service.query(xQuery); - - assertEquals("VirtualNodesetBUG_wiki_4", 1, rs.getSize()); - assertEquals("VirtualNodesetBUG_wiki_4", "", - rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + assertEquals("VirtualNodesetBUG_wiki_4", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("VirtualNodesetBUG_wiki_4", "", + resource.getContent().toString()); + } + } } /** * Problem in VirtualNodeSet because it computes the wrong level * - * @see http://wiki.exist-db.org/space/XQueryBugs + * @see http://wiki.exist-db.org/space/XQueryBugs */ @Test public void virtualNodeset_bug_wiki_5() throws XMLDBException { @@ -1461,11 +1818,13 @@ public void virtualNodeset_bug_wiki_5() throws XMLDBException { + ")/descendant-or-self::*/descendant::b return {$node}"; final XQueryService service = getQueryService(); - final ResourceSet rs = service.query(xQuery); - - assertEquals("VirtualNodesetBUG_wiki_5", 1, rs.getSize()); - assertEquals("VirtualNodesetBUG_wiki_5", "", - rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + assertEquals("VirtualNodesetBUG_wiki_5", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("VirtualNodesetBUG_wiki_5", "", + resource.getContent().toString()); + } + } } // It seems that the document builder receives events that are irrelevant. @@ -1477,11 +1836,13 @@ public void documentBuilder_bug_wiki_6() throws XMLDBException { + ""; final XQueryService service = getQueryService(); - final ResourceSet rs = service.query(xQuery); - - assertEquals("testDocumentBuilderBUG_wiki_6", 1, rs.getSize()); - assertEquals("testDocumentBuilderBUG_wiki_6", "", - rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + assertEquals("testDocumentBuilderBUG_wiki_6", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("testDocumentBuilderBUG_wiki_6", "", + resource.getContent().toString()); + } + } } @Test @@ -1489,11 +1850,13 @@ public void castInPredicate_bug_wiki_7() throws XMLDBException { final String xQuery = "let $number := 2, $list := (\"a\", \"b\", \"c\") return $list[xs:int($number * 2) - 1]"; final XQueryService service = getQueryService(); - final ResourceSet rs = service.query(xQuery); - - assertEquals("testCalculationInPredicate_wiki_7", 1, rs.getSize()); - assertEquals("testCalculationInPredicate_wiki_7", "c", - rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + assertEquals("testCalculationInPredicate_wiki_7", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("testCalculationInPredicate_wiki_7", "c", + resource.getContent().toString()); + } + } } /** @@ -1508,11 +1871,13 @@ public void computation_bug_wiki_8() throws XMLDBException { + "for $x in $a where $x/@id eq \"id\" return $x"; final XQueryService service = getQueryService(); - final ResourceSet rs = service.query(xQuery); - - assertEquals("testComputationBug_wiki_8", 1, rs.getSize()); - assertEquals("testComputationBug_wiki_8", "12", - rs.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(xQuery)) { + assertEquals("testComputationBug_wiki_8", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("testComputationBug_wiki_8", "12", + resource.getContent().toString()); + } + } } @Test @@ -1520,14 +1885,20 @@ public void strings() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService("strings.xml", strings); - ResourceSet result = queryResource(service, "strings.xml", "substring(/test/string[1], 1, 5)", 1); - assertEquals("Hello", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "strings.xml", "substring(/test/string[1], 1, 5)", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("Hello", resource.getContent().toString()); + } + } - queryResource(service, "strings.xml", "/test/string[starts-with(string(.), 'Hello')]", 2); + queryResourceV(service, "strings.xml", "/test/string[starts-with(string(.), 'Hello')]", 2); - result = queryResource(service, "strings.xml", "count(/test/item/price)", 1, - "Query should return an empty set (wrong document)"); - assertEquals("0", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "strings.xml", "count(/test/item/price)", 1, + "Query should return an empty set (wrong document)")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("0", resource.getContent().toString()); + } + }; } @Test @@ -1536,10 +1907,10 @@ public void quotes() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService("quotes.xml", quotes); - queryResource(service, "quotes.xml", "/test[title = '"Hello"']", 1); + queryResourceV(service, "quotes.xml", "/test[title = '"Hello"']", 1); service.declareVariable("content", ""Hello""); - queryResource(service, "quotes.xml", "declare variable $content as xs:string external; /test[title = $content]", 1); + queryResourceV(service, "quotes.xml", "declare variable $content as xs:string external; /test[title = $content]", 1); } @Test @@ -1548,62 +1919,107 @@ public void booleans() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService("numbers.xml", numbers); - ResourceSet result = queryResource(service, "numbers.xml", "boolean(1.0)", 1); - assertEquals("boolean value of 1.0 should be true", "true", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "boolean(1.0)", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of 1.0 should be true", "true", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "boolean(0.0)", 1); - assertEquals("boolean value of 0.0 should be false", "false", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "boolean(0.0)", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of 0.0 should be false", "false", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "boolean(xs:double(0.0))", 1); - assertEquals("boolean value of double 0.0 should be false", "false", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "boolean(xs:double(0.0))", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of double 0.0 should be false", "false", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "boolean(xs:double(1.0))", 1); - assertEquals("boolean value of double 1.0 should be true", "true", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "boolean(xs:double(1.0))", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of double 1.0 should be true", "true", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "boolean(xs:float(1.0))", 1); - assertEquals("boolean value of float 1.0 should be true", "true", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "boolean(xs:float(1.0))", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of float 1.0 should be true", "true", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "boolean(xs:float(0.0))", 1); - assertEquals("boolean value of float 0.0 should be false", "false", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "boolean(xs:float(0.0))", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of float 0.0 should be false", "false", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "boolean(xs:integer(0))", 1); - assertEquals("boolean value of integer 0 should be false", "false", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "boolean(xs:integer(0))", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of integer 0 should be false", "false", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "boolean(xs:integer(1))", 1); - assertEquals("boolean value of integer 1 should be true", "true", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "boolean(xs:integer(1))", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of integer 1 should be true", "true", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "'true' cast as xs:boolean", 1); - assertEquals("boolean value of 'true' cast to xs:boolean should be true", - "true", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "'true' cast as xs:boolean", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of 'true' cast to xs:boolean should be true", + "true", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "'false' cast as xs:boolean", 1); - assertEquals("boolean value of 'false' cast to xs:boolean should be false", - "false", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "'false' cast as xs:boolean", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of 'false' cast to xs:boolean should be false", + "false", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "boolean('Hello')", 1); - assertEquals("boolean value of string 'Hello' should be true", "true", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "boolean('Hello')", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of string 'Hello' should be true", "true", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "boolean('')", 1); - assertEquals("boolean value of empty string should be false", "false", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "boolean('')", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of empty string should be false", "false", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "boolean(())", 1); - assertEquals("boolean value of empty sequence should be false", "false", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "boolean(())", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of empty sequence should be false", "false", resource.getContent().toString()); + } + } - result = queryResource(service, "numbers.xml", "boolean(('Hello'))", 1); - assertEquals("boolean value of sequence with non-empty string should be true", - "true", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "boolean(('Hello'))", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of sequence with non-empty string should be true", + "true", resource.getContent().toString()); + } + } // result = queryResource(service, "numbers.xml", "boolean((0.0, 0.0))", 1); // assertEquals("boolean value of sequence with two elements should be true", "true", // result.getResource(0).getContent()); - result = queryResource(service, "numbers.xml", "boolean(//item[@id = '1']/price)", 1); - assertEquals("boolean value of 5.6 should be true", "true", - result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "numbers.xml", "boolean(//item[@id = '1']/price)", 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("boolean value of 5.6 should be true", "true", + resource.getContent().toString()); + } + } String message = ""; try { - queryResource(service, "numbers.xml", "boolean(current-time())", 1); + queryResourceV(service, "numbers.xml", "boolean(current-time())", 1); } catch (XMLDBException e) { message = e.getMessage(); } @@ -1616,39 +2032,44 @@ public void not() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService("strings.xml", strings); - queryResource(service, "strings.xml", "/test/string[not(@value)]", 2); + queryResourceV(service, "strings.xml", "/test/string[not(@value)]", 2); - ResourceSet result = queryResource(service, "strings.xml", "not(/test/abcd)", 1); - Resource r = result.getResource(0); - assertEquals("true", r.getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "strings.xml", "not(/test/abcd)", 1); + final Resource r = result.getResource(0)) { + assertEquals("true", r.getContent().toString()); + } - result = queryResource(service, "strings.xml", "not(/test)", 1); - r = result.getResource(0); - assertEquals("false", r.getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "strings.xml", "not(/test)", 1); + final Resource r = result.getResource(0)) { + assertEquals("false", r.getContent().toString()); + } - result = queryResource(service, "strings.xml", "/test/string[not(@id)]", 3); - r = result.getResource(0); - assertEquals("Hello World!", r.getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "strings.xml", "/test/string[not(@id)]", 3); + final Resource r = result.getResource(0)) { + assertEquals("Hello World!", r.getContent().toString()); + } // test with non-existing items - queryResource(service, "strings.xml", "/blah[not(blah)]", 0); - queryResource(service, "strings.xml", "//*[string][not(@value)]", 1); - queryResource(service, "strings.xml", "//*[string][not(@blah)]", 1); - queryResource(service, "strings.xml", "//*[blah][not(@blah)]", 0); + queryResourceV(service, "strings.xml", "/blah[not(blah)]", 0); + queryResourceV(service, "strings.xml", "//*[string][not(@value)]", 1); + queryResourceV(service, "strings.xml", "//*[string][not(@blah)]", 1); + queryResourceV(service, "strings.xml", "//*[blah][not(@blah)]", 0); } @Test public void logicalOr() throws XMLDBException, IOException, SAXException { final XQueryService service = storeXMLStringAndGetQueryService("strings.xml", strings); - - ResourceSet results = queryResource(service, "strings.xml", "{() or ()}", 1); - Resource result = results.getResource(0); - assertThat(result.getContent().toString(), CompareMatcher.isIdenticalTo("false")); - - results = queryResource(service, "strings.xml", "() or ()", 1); - result = results.getResource(0); - assertEquals("false", result.getContent().toString()); + + try (final EXistResourceSet result = queryResource(service, "strings.xml", "{() or ()}", 1); + final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("false")); + } + + try (final EXistResourceSet result = queryResource(service, "strings.xml", "() or ()", 1); + final Resource resource = result.getResource(0)) { + assertEquals("false", resource.getContent().toString()); + } } @Test @@ -1656,13 +2077,15 @@ public void logicalAnd() throws XMLDBException, IOException, SAXException { final XQueryService service = storeXMLStringAndGetQueryService("strings.xml", strings); - ResourceSet results = queryResource(service, "strings.xml", "{() and ()}", 1); - Resource result = results.getResource(0); - assertThat(result.getContent().toString(), CompareMatcher.isIdenticalTo("false")); + try (final EXistResourceSet result = queryResource(service, "strings.xml", "{() and ()}", 1); + final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("false")); + } - results = queryResource(service, "strings.xml", "() and ()", 1); - result = results.getResource(0); - assertEquals("false", result.getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "strings.xml", "() and ()", 1); + final Resource resource = result.getResource(0)) { + assertEquals("false", resource.getContent().toString()); + } } @Test @@ -1670,25 +2093,27 @@ public void ids_persistent() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService("ids.xml", ids); - queryResource(service, "ids.xml", "//a/id(@ref)", 1); - queryResource(service, "ids.xml", "/test/id(//a/@ref)", 1); + queryResourceV(service, "ids.xml", "//a/id(@ref)", 1); + queryResourceV(service, "ids.xml", "/test/id(//a/@ref)", 1); - ResourceSet result = queryResource(service, "ids.xml", "//a/id(@ref)/name", 1); - Resource r = result.getResource(0); - assertEquals("one", r.getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "ids.xml", "//a/id(@ref)/name", 1); + final Resource r = result.getResource(0)) { + assertEquals("one", r.getContent().toString()); + } - result = queryResource(service, "ids.xml", "//d/id(@ref)/name", 1); - r = result.getResource(0); - assertEquals("two", r.getContent().toString()); + try (final EXistResourceSet result = queryResource(service, "ids.xml", "//d/id(@ref)/name", 1); + final Resource r = result.getResource(0)) { + assertEquals("two", r.getContent().toString()); + } String update = "update insert Hello into /test"; - queryResource(service, "ids.xml", update, 0); + queryResourceV(service, "ids.xml", update, 0); - queryResource(service, "ids.xml", "/test/id('id3')", 1); + queryResourceV(service, "ids.xml", "/test/id('id3')", 1); update = "update value //t/@xml:id with 'id4'"; - queryResource(service, "ids.xml", update, 0); - queryResource(service, "ids.xml", "id('id4', /test)", 1); + queryResourceV(service, "ids.xml", update, 0); + queryResourceV(service, "ids.xml", "id('id4', /test)", 1); } @Ignore("Not yet supported in eXist") @@ -1696,30 +2121,37 @@ public void ids_persistent() throws XMLDBException { public void ids_memtree() throws XMLDBException { final XQueryService service = getQueryService(); - ResourceSet result = service.query("document { " + ids_content + " }//a/id(@ref)"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("document { " + ids_content + " }//a/id(@ref)")) { + assertEquals(1, result.getSize()); + } - result = service.query("document { " + ids_content + " }/test/id(//a/@ref)"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("document { " + ids_content + " }/test/id(//a/@ref)")) { + assertEquals(1, result.getSize()); + } - result = service.query("document { " + ids_content + " }//a/id(@ref)/name"); - assertEquals(1, result.getSize()); - Resource r = result.getResource(0); - assertEquals("one", r.getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("document { " + ids_content + " }//a/id(@ref)/name")) { + assertEquals(1, result.getSize()); + try (final Resource r = result.getResource(0)) { + assertEquals("one", r.getContent().toString()); + } + } - result = service.query("document { " + ids_content + " }//d/id(@ref)/name"); - r = result.getResource(0); - assertEquals("two", r.getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("document { " + ids_content + " }//d/id(@ref)/name"); + final Resource r = result.getResource(0)) { + assertEquals("two", r.getContent().toString()); + } } @Test public void idsOnEmptyCollection() throws XMLDBException { - final Collection root = DatabaseManager.getCollection(getBaseUri(), "admin", ""); - final CollectionManagementService service = root.getService(CollectionManagementService.class); - final Collection emptyCollection = service.createCollection("empty"); - final XQueryService queryService = (XQueryService) emptyCollection.getService(XPathQueryService.class); - queryAndAssert(queryService, "/*", 0, null); - queryAndAssert(queryService, "/id('foo')", 0, null); + try (final Collection root = DatabaseManager.getCollection(getBaseUri(), "admin", "")) { + final CollectionManagementService service = root.getService(CollectionManagementService.class); + try (final Collection emptyCollection = service.createCollection("empty")) { + final XQueryService queryService = (XQueryService) emptyCollection.getService(XPathQueryService.class); + queryAndAssert(queryService, "/*", 0, null); + queryAndAssert(queryService, "/id('foo')", 0, null); + } + } } @Test @@ -1727,10 +2159,10 @@ public void idRefs_persistent() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService("ids.xml", ids); - queryResource(service, "ids.xml", "/idref('id2')", 1); - queryResource(service, "ids.xml", "/idref('id1')", 2); - queryResource(service, "ids.xml", "/idref(('id2', 'id1'))", 3); - queryResource(service, "ids.xml", "{/idref('id2')}", 1); + queryResourceV(service, "ids.xml", "/idref('id2')", 1); + queryResourceV(service, "ids.xml", "/idref('id1')", 2); + queryResourceV(service, "ids.xml", "/idref(('id2', 'id1'))", 3); + queryResourceV(service, "ids.xml", "{/idref('id2')}", 1); } @Ignore("Not yet supported in eXist") @@ -1738,86 +2170,86 @@ public void idRefs_persistent() throws XMLDBException { public void idRefs_memtree() throws XMLDBException { final XQueryService service = getQueryService(); - ResourceSet result = service.query("document {" + ids_content + "}/idref('id2')"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("document {" + ids_content + "}/idref('id2')")) { + assertEquals(1, result.getSize()); + } - result = service.query("document {" + ids_content + "}/idref('id1')"); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("document {" + ids_content + "}/idref('id1')")) { + assertEquals(2, result.getSize()); + } - result = service.query("document {" + ids_content + "}/idref(('id2', 'id1'))"); - assertEquals(3, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("document {" + ids_content + "}/idref(('id2', 'id1'))")) { + assertEquals(3, result.getSize()); + } - result = service.query("let $doc := document {" + ids_content + "} return {$doc/idref('id2')}"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query("let $doc := document {" + ids_content + "} return {$doc/idref('id2')}")) { + assertEquals(1, result.getSize()); + } } @Test public void externalVars() throws XMLDBException { - XQueryService service = - storeXMLStringAndGetQueryService("strings.xml", strings); + final XQueryService service1 = storeXMLStringAndGetQueryService("strings.xml", strings); String query = "declare variable $x external;" + "$x"; - CompiledExpression expr = service.compile(query); + final CompiledExpression expr1 = service1.compile(query); //Do not declare the variable... - boolean exceptionThrown = false; - try { - service.execute(expr); - } catch (XMLDBException e) { - exceptionThrown = true; - } - assertTrue("Expected XPTY0002", exceptionThrown); + assertThrows("Expected XPTY0002", XMLDBException.class, () -> { + try (final EXistResourceSet result = (EXistResourceSet) service1.execute(expr1)) { + // needed to ensure that reesult is closed + } + }); query = "declare variable $local:string external;" + "/test/string[. = $local:string]"; - expr = service.compile(query); - service.declareVariable("local:string", "Hello"); - - ResourceSet result = service.execute(expr); - - final XMLResource r = (XMLResource) result.getResource(0); - Node node = r.getContentAsDOM(); - if (node.getNodeType() == Node.DOCUMENT_NODE) { - node = node.getFirstChild(); + final CompiledExpression expr2 = service1.compile(query); + service1.declareVariable("local:string", "Hello"); + + try (final EXistResourceSet result = (EXistResourceSet) service1.execute(expr2); + final XMLResource r = (XMLResource) result.getResource(0)) { + Node node = r.getContentAsDOM(); + if (node.getNodeType() == Node.DOCUMENT_NODE) { + node = node.getFirstChild(); + } + assertEquals("string", node.getNodeName()); } - assertEquals("string", node.getNodeName()); - //Instanciate a new service to prevent variable reuse //TODO : consider auto-reset ? - service = storeXMLStringAndGetQueryService("strings.xml", strings); + final XQueryService service2 = storeXMLStringAndGetQueryService("strings.xml", strings); query = "declare variable $local:string as xs:string external;" + "$local:string"; - expr = service.compile(query); + final CompiledExpression expr3 = service2.compile(query); //TODO : we should virtually pass any kind of value - service.declareVariable("local:string", Integer.valueOf(1)); + service2.declareVariable("local:string", Integer.valueOf(1)); String message = ""; try { - service.execute(expr); + service2.execute(expr3); } catch (XMLDBException e) { //e.printStackTrace(); message = e.getMessage(); } assertTrue(message.indexOf("XPTY0004") > -1); - service = storeXMLStringAndGetQueryService("strings.xml", strings); + final XQueryService service3 = storeXMLStringAndGetQueryService("strings.xml", strings); query = "declare variable $x as xs:integer external; " + "$x"; - expr = service.compile(query); + final CompiledExpression expr4 = service3.compile(query); //TODO : we should virtually pass any kind of value - service.declareVariable("x", "1"); + service3.declareVariable("x", "1"); message = ""; try { - service.execute(expr); - } catch (XMLDBException e) { + service3.execute(expr4); + } catch (final XMLDBException e) { //e.printStackTrace(); message = e.getMessage(); } @@ -1834,28 +2266,32 @@ public void externalVars2() throws ParserConfigurationException, IOException, SA final XQueryService service = testCollection.getService(XQueryService.class); final CompiledExpression expr = service.compile("declare variable $local:node external; $local:node//string"); service.declareVariable("local:node", doc.getDocumentElement()); - final ResourceSet result = service.execute(expr); - assertEquals(3, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.execute(expr)) { + assertEquals(3, result.getSize()); + } } @Test public void queryResource() throws XMLDBException { - XMLResource doc = testCollection.createResource("strings.xml", XMLResource.class); - doc.setContent(strings); - testCollection.storeResource(doc); - - doc = testCollection.createResource("strings2.xml", XMLResource.class); - doc.setContent(strings); - testCollection.storeResource(doc); - - final XPathQueryService query = - testCollection.getService( - XPathQueryService.class); - ResourceSet result = query.queryResource("strings2.xml", "/test/string[. = 'Hello World!']"); - assertEquals(1, result.getSize()); - - result = query.query("/test/string[. = 'Hello World!']"); - assertEquals(2, result.getSize()); + try (final XMLResource doc = testCollection.createResource("strings.xml", XMLResource.class)) { + doc.setContent(strings); + testCollection.storeResource(doc); + } + + try (final XMLResource doc = testCollection.createResource("strings2.xml", XMLResource.class)) { + doc.setContent(strings); + testCollection.storeResource(doc); + } + + final XPathQueryService query = testCollection.getService(XPathQueryService.class); + + try (final EXistResourceSet result = (EXistResourceSet) query.queryResource("strings2.xml", "/test/string[. = 'Hello World!']")) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) query.query("/test/string[. = 'Hello World!']")) { + assertEquals(2, result.getSize()); + } } /** @@ -1865,8 +2301,7 @@ public void queryResource() throws XMLDBException { */ @Test public void ancestor() throws XMLDBException { - final XQueryService service = - storeXMLStringAndGetQueryService("numbers.xml", numbers); + final XQueryService service = storeXMLStringAndGetQueryService("numbers.xml", numbers); final String query = "let $all_items := /test/item " + @@ -1878,86 +2313,103 @@ public void ancestor() throws XMLDBException { " return 'foo'" + "return $all_items"; - final ResourceSet result = service.queryResource("numbers.xml", query ); - assertEquals(4, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("numbers.xml", query)) { + assertEquals(4, result.getSize()); + } } @Test public void namespaces() throws XMLDBException { - final XQueryService service = - storeXMLStringAndGetQueryService("namespaces.xml", namespaces); + final XQueryService service = storeXMLStringAndGetQueryService("namespaces.xml", namespaces); service.setNamespace("t", "http://www.foo.com"); service.setNamespace("c", "http://www.other.com"); - ResourceSet result = - service.queryResource("namespaces.xml", "//t:section"); - assertEquals(1, result.getSize()); - result = - service.queryResource("namespaces.xml", "/t:test//c:comment"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", "//t:section")) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", "/t:test//c:comment")) { + assertEquals(1, result.getSize()); + } - result = service.queryResource("namespaces.xml", "//c:*"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", "//c:*")) { + assertEquals(1, result.getSize()); + } - result = service.queryResource("namespaces.xml", "//*:comment"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", "//*:comment")) { + assertEquals(1, result.getSize()); + } - result = service.queryResource("namespaces.xml", "namespace-uri(//t:test)"); - assertEquals(1, result.getSize()); - assertEquals("http://www.foo.com", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("namespaces.xml", "namespace-uri(//t:test)")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("http://www.foo.com", resource.getContent().toString()); + } + } } @Test public void preserveSpace() throws XMLDBException, IOException, SAXException { - final XQueryService service = - storeXMLStringAndGetQueryService("whitespace.xml", ws); + final XQueryService service = storeXMLStringAndGetQueryService("whitespace.xml", ws); - final ResourceSet result = - service.queryResource("whitespace.xml", "//text"); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("whitespace.xml", "//text")) { + assertEquals(2, result.getSize()); - String item = result.getResource(0).getContent().toString(); - assertThat(item, CompareMatcher.isIdenticalTo(" ")); + try (final Resource resource = result.getResource(0)) { + final String item = resource.getContent().toString(); + assertThat(item, CompareMatcher.isIdenticalTo(" ")); + } - item = result.getResource(1).getContent().toString(); - assertThat(item, CompareMatcher.isIdenticalTo(" ")); + try (final Resource resource = result.getResource(1)) { + final String item = resource.getContent().toString(); + assertThat(item, CompareMatcher.isIdenticalTo(" ")); + } + } } @Test public void nestedElements() throws XMLDBException { - final XQueryService service = - storeXMLStringAndGetQueryService("nested.xml", nested); + final XQueryService service = storeXMLStringAndGetQueryService("nested.xml", nested); - final ResourceSet result = service.queryResource("nested.xml", "//c"); - assertEquals(3, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("nested.xml", "//c")) { + assertEquals(3, result.getSize()); + } } @Test public void staticVariables() throws XMLDBException { - final XMLResource doc = - testCollection.createResource( - "numbers.xml", XMLResource.class ); - doc.setContent(numbers); - testCollection.storeResource(doc); - XPathQueryService service = - testCollection.getService( - XPathQueryService.class); - - final EXistXPathQueryService service2 = (EXistXPathQueryService) service; - service2.declareVariable("name", "MONTAGUE"); - ResourceSet result = service.query("declare variable $name as xs:string external; //SPEECH[SPEAKER = $name]"); - assertEquals(0, result.getSize()); - service2.declareVariable("name", "43"); - result = service2.query(doc, "declare variable $name as xs:string external; //item[stock = $name]"); - assertEquals(1, result.getSize()); - result = service2.query("declare variable $name as xs:string external; $name"); - assertEquals(1, result.getSize()); - service2.clearVariables(); - result = service2.query( doc, "//item[stock = 43]"); - assertEquals(1, result.getSize()); - result = service2.query(doc, "//item"); - assertEquals(4, result.getSize()); + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + + try (final XMLResource doc = testCollection.createResource("numbers.xml", XMLResource.class)) { + doc.setContent(numbers); + testCollection.storeResource(doc); + + final EXistXPathQueryService service2 = (EXistXPathQueryService) service; + service2.declareVariable("name", "MONTAGUE"); + try (final EXistResourceSet result = (EXistResourceSet) service.query("declare variable $name as xs:string external; //SPEECH[SPEAKER = $name]")) { + assertEquals(0, result.getSize()); + } + + service2.declareVariable("name", "43"); + try (final EXistResourceSet result = service2.query(doc, "declare variable $name as xs:string external; //item[stock = $name]")) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service2.query("declare variable $name as xs:string external; $name")) { + assertEquals(1, result.getSize()); + } + + service2.clearVariables(); + + try (final EXistResourceSet result = service2.query(doc, "//item[stock = 43]")) { + assertEquals(1, result.getSize()); + } + + try (final EXistResourceSet result = service2.query(doc, "//item")) { + assertEquals(4, result.getSize()); + } + } } @Test @@ -1967,50 +2419,61 @@ public void membersAsResource() throws XMLDBException, IOException { // "XPathQueryService", // "1.0"); // ResourceSet result = service.query("//SPEECH[LINE &= 'marriage']"); - final XQueryService service = - storeXMLStringAndGetQueryService("numbers.xml", numbers); - final ResourceSet result = service.query("//item/price"); - - final Resource r = result.getMembersAsResource(); - final Object rawContent = r.getContent(); - String content = null; - if(rawContent instanceof File) { - final Path p = ((File) rawContent).toPath(); - content = new String(Files.readAllBytes(p), UTF_8); - } else { - content = (String)r.getContent(); - } + final XQueryService service = storeXMLStringAndGetQueryService("numbers.xml", numbers); + try (final EXistResourceSet result = (EXistResourceSet) service.query("//item/price"); + final Resource r = result.getMembersAsResource()) { + final Object rawContent = r.getContent(); + final String content; + if (rawContent instanceof File) { + final Path p = ((File) rawContent).toPath(); + content = new String(Files.readAllBytes(p), UTF_8); + } else { + content = (String) r.getContent(); + } - final Pattern p = Pattern.compile(".*(.*){4}", Pattern.DOTALL); - final Matcher m = p.matcher(content); - assertTrue("get whole document numbers.xml", m.matches()); + final Pattern p = Pattern.compile(".*(.*){4}", Pattern.DOTALL); + final Matcher m = p.matcher(content); + assertTrue("get whole document numbers.xml", m.matches()); + } } @Test public void satisfies() throws XMLDBException { final XQueryService service = getQueryService(); - ResourceSet result = queryAndAssert(service, + try (final EXistResourceSet result = queryAndAssert(service, "every $foo in (1,2,3) satisfies" + " let $bar := 'baz'" + " return false() ", - 1, ""); - assertEquals("satisfies + FLWR expression allways false 1", "false", result.getResource(0).getContent().toString()); + 1, "")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("satisfies + FLWR expression allways false 1", "false", resource.getContent().toString()); + } + } - result = queryAndAssert(service, + try (final EXistResourceSet result = queryAndAssert(service, "declare function local:foo() { false() };" + " every $bar in (1,2,3) satisfies" + " local:foo()", - 1, ""); - assertEquals("satisfies + FLWR expression allways false 2", "false", result.getResource(0).getContent().toString()); + 1, "")) { + try (final Resource resource = result.getResource(0)) { + assertEquals("satisfies + FLWR expression allways false 2", "false", resource.getContent().toString()); + } + } String query = "every $x in () satisfies false()"; - result = queryAndAssert(service, query, 1, ""); - assertEquals(query, "true", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryAndAssert(service, query, 1, "")) { + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "true", resource.getContent().toString()); + } + } query = "some $x in () satisfies true()"; - result = queryAndAssert(service, query, 1, ""); - assertEquals(query, "false", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryAndAssert(service, query, 1, "")) { + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "false", resource.getContent().toString()); + } + } } @Test @@ -2018,13 +2481,13 @@ public void intersect() throws XMLDBException { final XQueryService service = getQueryService(); String query = "() intersect ()"; - queryAndAssert(service, query, 0, ""); + queryAndAssertV(service, query, 0, ""); query = "() intersect (1)"; - queryAndAssert(service, query, 0, ""); + queryAndAssertV(service, query, 0, ""); query = "(1) intersect ()"; - queryAndAssert(service, query, 0, ""); + queryAndAssertV(service, query, 0, ""); } @Test @@ -2032,12 +2495,12 @@ public void union() throws XMLDBException { final XQueryService service = getQueryService(); String query = "() union ()"; - queryAndAssert( service, query, 0, ""); + queryAndAssertV( service, query, 0, ""); String message = ""; try { query = "() union (1)"; - queryAndAssert( service, query, 0, ""); + queryAndAssertV( service, query, 0, ""); } catch (XMLDBException e) { message = e.getMessage(); } @@ -2046,19 +2509,19 @@ public void union() throws XMLDBException { message = ""; try { query = "(1) union ()"; - queryAndAssert(service, query, 0, ""); + queryAndAssertV(service, query, 0, ""); } catch (XMLDBException e) { message = e.getMessage(); } assertTrue(message.indexOf("XPTY0004") > -1); query = " union ()"; - queryAndAssert(service, query, 1, ""); + queryAndAssertV(service, query, 1, ""); query = "() union "; - queryAndAssert(service, query, 1, ""); + queryAndAssertV(service, query, 1, ""); //Not the same nodes query = " union "; - queryAndAssert(service, query, 2, ""); + queryAndAssertV(service, query, 2, ""); } @Test @@ -2066,35 +2529,35 @@ public void except() throws XMLDBException { final XQueryService service = getQueryService(); String query = "() except ()"; - queryAndAssert(service, query, 0, ""); + queryAndAssertV(service, query, 0, ""); query = "() except (1)"; - queryAndAssert(service, query, 0, ""); + queryAndAssertV(service, query, 0, ""); String message = ""; try { query = "(1) except ()"; - queryAndAssert(service, query, 0, ""); + queryAndAssertV(service, query, 0, ""); } catch (XMLDBException e) { message = e.getMessage(); } assertTrue(message.indexOf("XPTY0004") > -1); query = " except ()"; - queryAndAssert(service, query, 1, ""); + queryAndAssertV(service, query, 1, ""); query = "() except "; - queryAndAssert(service, query, 0, ""); + queryAndAssertV(service, query, 0, ""); //Not the same nodes query = " except "; - queryAndAssert(service, query, 1, ""); + queryAndAssertV(service, query, 1, ""); } @Test public void convertToBoolean() throws XMLDBException { final XQueryService service = getQueryService(); - - ResourceSet result = queryAndAssert( + + try (final EXistResourceSet result = queryAndAssert( service, "let $doc := " + "return (" + " {boolean(($doc,2,3))} ," @@ -2107,22 +2570,25 @@ public void convertToBoolean() throws XMLDBException { + " {boolean('')} ," + " {boolean(number(0))} ," + " {boolean(number('NaN'))}" + ")", - 10, ""); - - for (int i = 0; i < 10; i++) { - if(i < 5) { - assertEquals("true " + (i + 1), "true", result - .getResource(i).getContent().toString()); - } else { - assertEquals("false " + (i + 1), "false", result - .getResource(i).getContent().toString()); + 10, "")) { + + for (int i = 0; i < 10; i++) { + try (final Resource resource = result.getResource(i)) { + if (i < 5) { + assertEquals("true " + (i + 1), "true", + resource.getContent().toString()); + } else { + assertEquals("false " + (i + 1), "false", + resource.getContent().toString()); + } + } } } boolean exceptionThrown = false; String message = ""; try { - queryAndAssert(service, + queryAndAssertV(service, "let $doc := " + " return boolean( (1,2,$doc) )", 1, ""); } catch (XMLDBException e) { @@ -2175,12 +2641,14 @@ public void xpointerElementNameHandling() throws XMLDBException { final XQueryService service = storeXMLStringAndGetQueryService( "xpointer.xml", xpointerElementName); - ResourceSet result = service.queryResource("xpointer.xml", - "/test/.[local-name()='xpointer']"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("xpointer.xml", + "/test/.[local-name()='xpointer']")) { + assertEquals(1, result.getSize()); + } - result = service.queryResource("xpointer.xml", "/test/xpointer"); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("xpointer.xml", "/test/xpointer")) { + assertEquals(1, result.getSize()); + } } @Test @@ -2195,30 +2663,42 @@ public void atomization() throws XMLDBException, IOException, SAXException { " element {ex:elementName()} { 'b' }\n" + "}"; - final EXistXQueryService service = (EXistXQueryService)getQueryService(); + final EXistXQueryService service = (EXistXQueryService) getQueryService(); service.setProperty(OutputKeys.INDENT, "no"); - final ResourceSet result = service.query(query); - assertEquals(1, result.getSize()); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("ab")); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("ab")); + } + } } @Test public void substring() throws XMLDBException { final XQueryService service = getQueryService(); - + // Test cases by MIKA final String validQuery = "substring(\"MK-1234\", 4,1)"; - ResourceSet result = queryAndAssert( service, validQuery, 1, validQuery); - assertEquals("1", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryAndAssert(service, validQuery, 1, validQuery)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent().toString()); + } + } String invalidQuery = "substring(\"MK-1234\", 4,4)"; - result = queryAndAssert( service, invalidQuery, 1, invalidQuery); - assertEquals("1234", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryAndAssert(service, invalidQuery, 1, invalidQuery)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("1234", resource.getContent().toString()); + } + } // Test case by Toar final String toarQuery="let $num := \"2003.123\" \n return substring($num, 1, 7)"; - result = queryAndAssert( service, toarQuery, 1, toarQuery); - assertEquals("2003.12", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryAndAssert(service, toarQuery, 1, toarQuery)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("2003.12", resource.getContent().toString()); + } + } } @Test @@ -2229,16 +2709,22 @@ public void cdataPersistentDom() throws XMLDBException { storeXMLStringAndGetQueryService(docName, cdata_xml); String query = "/elem1"; - ResourceSet result = queryResource(service, docName, query, 1); - final String expected = "" + cdata_content.replace("<", "<").replace(">", ">") + ""; - assertEquals(expected, result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, docName, query, 1)) { + final String expected = "" + cdata_content.replace("<", "<").replace(">", ">") + ""; + try (final Resource resource = result.getResource(0)) { + assertEquals(expected, resource.getContent().toString()); + } + } query = "declare namespace output = \"http://www.w3.org/2010/xslt-xquery-serialization\";\n" + "declare option output:cdata-section-elements \"elem1\";\n" + "/elem1\n"; - result = queryResource(service, docName, query, 1); - assertEquals(cdata_xml, result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, docName, query, 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals(cdata_xml, resource.getContent().toString()); + } + } query = "fn:serialize(doc(\"/db/test/" + docName + "\"),\n" + @@ -2246,8 +2732,11 @@ public void cdataPersistentDom() throws XMLDBException { " \n" + " \n" + ")"; - result = queryResource(service, docName, query, 1); - assertEquals(cdata_xml, result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, docName, query, 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals(cdata_xml, resource.getContent().toString()); + } + } query = "fn:serialize(doc(\"/db/test/" + docName + "\"),\n" + @@ -2255,8 +2744,11 @@ public void cdataPersistentDom() throws XMLDBException { " \"method\": \"xml\",\n" + " \"cdata-section-elements\": xs:QName(\"elem1\")\n" + "})"; - result = queryResource(service, docName, query, 1); - assertEquals(cdata_xml, result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryResource(service, docName, query, 1)) { + try (final Resource resource = result.getResource(0)) { + assertEquals(cdata_xml, resource.getContent().toString()); + } + } } @Test @@ -2267,17 +2759,23 @@ public void cdataMemtreeDom() throws XMLDBException, IOException { final XQueryService service = getQueryService(); - String query = "doc(\"" + tempFile.toUri().toString() + "\")"; - ResourceSet result = queryAndAssert(service, query, 1, null); - final String expected = "" + cdata_content.replace("<", "<").replace(">", ">") + ""; - assertEquals(expected, result.getResource(0).getContent().toString()); + String query = "doc(\"" + tempFile.toUri() + "\")"; + try (final EXistResourceSet result = queryAndAssert(service, query, 1, null)) { + final String expected = "" + cdata_content.replace("<", "<").replace(">", ">") + ""; + try (final Resource resource = result.getResource(0)) { + assertEquals(expected, resource.getContent().toString()); + } + } query = "declare namespace output = \"http://www.w3.org/2010/xslt-xquery-serialization\";\n" + "declare option output:cdata-section-elements \"elem1\";\n" + "doc(\"" + tempFile.toUri().toString() + "\")\n"; - result = queryAndAssert(service, query, 1, null); - assertEquals(cdata_xml, result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryAndAssert(service, query, 1, null)) { + try (final Resource resource = result.getResource(0)) { + assertEquals(cdata_xml, resource.getContent().toString()); + } + } query = "fn:serialize(doc(\"" + tempFile.toUri().toString() + "\"),\n" + @@ -2285,8 +2783,11 @@ public void cdataMemtreeDom() throws XMLDBException, IOException { " \n" + " \n" + ")"; - result = queryAndAssert(service, query, 1, null); - assertEquals(cdata_xml, result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryAndAssert(service, query, 1, null)) { + try (final Resource resource = result.getResource(0)) { + assertEquals(cdata_xml, resource.getContent().toString()); + } + } query = "fn:serialize(doc(\"" + tempFile.toUri().toString() + "\"),\n" + @@ -2294,8 +2795,11 @@ public void cdataMemtreeDom() throws XMLDBException, IOException { " \"method\": \"xml\",\n" + " \"cdata-section-elements\": xs:QName(\"elem1\")\n" + "})"; - result = queryAndAssert(service, query, 1, null); - assertEquals(cdata_xml, result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryAndAssert(service, query, 1, null)) { + try (final Resource resource = result.getResource(0)) { + assertEquals(cdata_xml, resource.getContent().toString()); + } + } } @Test @@ -2306,9 +2810,12 @@ public void cdataComputedDom() throws XMLDBException { "document {\n" + cdata_xml + "\n" + "}"; - ResourceSet result = queryAndAssert(service, query, 1, null); - final String expected = "" + cdata_content.replace("<", "<").replace(">", ">") + ""; - assertEquals(expected, result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryAndAssert(service, query, 1, null)) { + final String expected = "" + cdata_content.replace("<", "<").replace(">", ">") + ""; + try (final Resource resource = result.getResource(0)) { + assertEquals(expected, resource.getContent().toString()); + } + } query = "declare namespace output = \"http://www.w3.org/2010/xslt-xquery-serialization\";\n" + @@ -2316,8 +2823,11 @@ public void cdataComputedDom() throws XMLDBException { "document {\n" + cdata_xml + "\n" + "}"; - result = queryAndAssert(service, query, 1, null); - assertEquals(cdata_xml, result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryAndAssert(service, query, 1, null)) { + try (final Resource resource = result.getResource(0)) { + assertEquals(cdata_xml, resource.getContent().toString()); + } + } query = "fn:serialize(document {" + cdata_xml + "},\n" + @@ -2325,8 +2835,11 @@ public void cdataComputedDom() throws XMLDBException { " \n" + " \n" + ")"; - result = queryAndAssert(service, query, 1, null); - assertEquals(cdata_xml, result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryAndAssert(service, query, 1, null)) { + try (final Resource resource = result.getResource(0)) { + assertEquals(cdata_xml, resource.getContent().toString()); + } + } query = "fn:serialize(document {" + cdata_xml + "},\n" + @@ -2334,8 +2847,21 @@ public void cdataComputedDom() throws XMLDBException { " \"method\": \"xml\",\n" + " \"cdata-section-elements\": xs:QName(\"elem1\")\n" + "})"; - result = queryAndAssert(service, query, 1, null); - assertEquals(cdata_xml, result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = queryAndAssert(service, query, 1, null)) { + try (final Resource resource = result.getResource(0)) { + assertEquals(cdata_xml, resource.getContent().toString()); + } + } + } + + + /** + * Helper that performs an XQuery and does JUnit assertion on result size. + * + * @see #queryResourceV(XQueryService, String, String, int, String) + */ + private void queryResourceV(final XQueryService service, final String resource, final String query, final int expected) throws XMLDBException { + queryResourceV(service, resource, query, expected, null); } /** @@ -2343,11 +2869,21 @@ public void cdataComputedDom() throws XMLDBException { * * @see #queryResource(XQueryService, String, String, int, String) */ - private ResourceSet queryResource(final XQueryService service, final String resource, - final String query, final int expected) throws XMLDBException { + private EXistResourceSet queryResource(final XQueryService service, final String resource, final String query, final int expected) throws XMLDBException { return queryResource(service, resource, query, expected, null); } + /** + * Helper that performs an XQuery and does JUnit assertion on result size. + * + * @see #queryResource(XQueryService, String, String, int, String) + */ + private void queryResourceV(final XQueryService service, final String resource, final String query, final int expected, @Nullable final String message) throws XMLDBException { + try (final EXistResourceSet result = queryResource(service, resource, query, expected, message)) { + // needed to ensure that result is closed + } + } + /** * Helper that performs an XQuery and does JUnit assertion on result size. * @@ -2360,9 +2896,8 @@ private ResourceSet queryResource(final XQueryService service, final String reso * @return a ResourceSet, allowing to do more assertions if necessary. * @throws XMLDBException */ - private ResourceSet queryResource(final XQueryService service, final String resource, - final String query, final int expected, final String message) throws XMLDBException { - final ResourceSet result = service.queryResource(resource, query); + private EXistResourceSet queryResource(final XQueryService service, final String resource, final String query, final int expected, @Nullable final String message) throws XMLDBException { + final EXistResourceSet result = (EXistResourceSet) service.queryResource(resource, query); if(message == null) { assertEquals(query, expected, result.getSize()); } else { @@ -2371,10 +2906,15 @@ private ResourceSet queryResource(final XQueryService service, final String reso return result; } + private void queryAndAssertV(final XQueryService service, final String query, final int expected, @Nullable final String message) throws XMLDBException { + try (final EXistResourceSet result = queryAndAssert(service, query, expected, message)) { + // needed to ensure that result is closed + } + } + /** For queries without associated data */ - private ResourceSet queryAndAssert(final XQueryService service, final String query, - final int expected, final String message) throws XMLDBException { - final ResourceSet result = service.query(query); + private EXistResourceSet queryAndAssert(final XQueryService service, final String query, final int expected, @Nullable final String message) throws XMLDBException { + final EXistResourceSet result = (EXistResourceSet) service.query(query); if(message == null) { assertEquals(expected, result.getSize()); } else { @@ -2396,16 +2936,11 @@ private XQueryService getQueryService() throws XMLDBException { * @return the XQuery Service * @throws XMLDBException */ - private XQueryService storeXMLStringAndGetQueryService(final String documentName, - final String content) throws XMLDBException { - final XMLResource doc = - testCollection.createResource( - documentName, XMLResource.class ); - doc.setContent(content); - testCollection.storeResource(doc); - final XQueryService service = - (XQueryService) testCollection.getService( - XPathQueryService.class); - return service; + private XQueryService storeXMLStringAndGetQueryService(final String documentName, final String content) throws XMLDBException { + try (final XMLResource doc = testCollection.createResource(documentName, XMLResource.class)) { + doc.setContent(content); + testCollection.storeResource(doc); + } + return getQueryService(); } } diff --git a/exist-core/src/test/java/org/exist/xquery/XQueryFunctionsTest.java b/exist-core/src/test/java/org/exist/xquery/XQueryFunctionsTest.java index dcc07e3dd8..4aa4da0dbf 100644 --- a/exist-core/src/test/java/org/exist/xquery/XQueryFunctionsTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XQueryFunctionsTest.java @@ -54,13 +54,14 @@ import com.googlecode.junittoolbox.ParallelRunner; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.XmldbURI; import org.junit.ClassRule; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; @@ -92,22 +93,26 @@ public class XQueryFunctionsTest { @Test public void arguments() throws XMLDBException { - ResourceSet result = existEmbeddedServer.executeQuery("declare function local:testAnyURI($uri as xs:string) as xs:string { " + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("declare function local:testAnyURI($uri as xs:string) as xs:string { " + "concat('Successfully processed as xs:string : ',$uri) " + "}; " + "let $a := xs:anyURI('http://exist.sourceforge.net/') " + - "return local:testAnyURI($a)"); - assertEquals(1, result.getSize()); - String r = (String) result.getResource(0).getContent(); - assertEquals("Successfully processed as xs:string : http://exist.sourceforge.net/", r); + "return local:testAnyURI($a)")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("Successfully processed as xs:string : http://exist.sourceforge.net/", r); + } + } - result = existEmbeddedServer.executeQuery("declare function local:testEmpty($blah as xs:string) as element()* { " + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("declare function local:testEmpty($blah as xs:string) as element()* { " + "for $a in (1,2,3) order by $a " + "return () " + "}; " + - "local:testEmpty('test')"); - assertEquals(0, result.getSize()); + "local:testEmpty('test')")) { + assertEquals(0, result.getSize()); + } } /** @@ -117,19 +122,28 @@ public void arguments() throws XMLDBException { @Test public void roundHtE_INTEGER() throws XMLDBException { String query = "fn:round-half-to-even( xs:integer('1'), 0 )"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - String r = (String) result.getResource(0).getContent(); - assertEquals("1", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("1", r); + } + } query = "fn:round-half-to-even( xs:integer('6'), -1 )"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals("10", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("10", r); + } + } query = "fn:round-half-to-even( xs:integer('5'), -1 )"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals("0", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("0", r); + } + } } /** @@ -147,10 +161,13 @@ public void roundHtE_DOUBLE() throws XMLDBException { {0, 0, 0, 2, 2, -2}; for (int i = 0; i < testvalues.length; i++) { - String query = "fn:round-half-to-even( xs:double('" + testvalues[i] + "'), " + precision[i] + " )"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - String r = (String) result.getResource(0).getContent(); - assertEquals(resultvalues[i], r); + final String query = "fn:round-half-to-even( xs:double('" + testvalues[i] + "'), " + precision[i] + " )"; + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals(resultvalues[i], r); + } + } } } @@ -159,163 +176,241 @@ public void roundHtE_DOUBLE() throws XMLDBException { */ @Test public void tokenize() throws XMLDBException { - ResourceSet result = existEmbeddedServer.executeQuery("count ( tokenize('a/b' , '/') )"); - String r = (String) result.getResource(0).getContent(); - assertEquals("2", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("count ( tokenize('a/b' , '/') )")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("2", r); + } + } - result = existEmbeddedServer.executeQuery("count ( tokenize('a/b/' , '/') )"); - r = (String) result.getResource(0).getContent(); - assertEquals("3", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("count ( tokenize('a/b/' , '/') )")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("3", r); + } + } - result = existEmbeddedServer.executeQuery("count ( tokenize('' , '/') )"); - r = (String) result.getResource(0).getContent(); - assertEquals("0", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("count ( tokenize('' , '/') )")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("0", r); + } + } - result = existEmbeddedServer.executeQuery( + try (final EXistResourceSet result = existEmbeddedServer.executeQuery( "let $res := fn:tokenize('abracadabra', '(ab)|(a)')" + "let $reference := ('', 'r', 'c', 'd', 'r', '')" + - "return fn:deep-equal($res, $reference)"); - r = (String) result.getResource(0).getContent(); - assertEquals("true", r); - - result = existEmbeddedServer.executeQuery("tokenize('firstSecondThirdLast', '[A-Z]')"); - assertEquals(4, result.getSize()); - r = (String) result.getResource(0).getContent(); - assertEquals("first", r); - r = (String) result.getResource(1).getContent(); - assertEquals("econd", r); - r = (String) result.getResource(2).getContent(); - assertEquals("hird", r); - r = (String) result.getResource(3).getContent(); - assertEquals("ast", r); + "return fn:deep-equal($res, $reference)")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("true", r); + } + } + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("tokenize('firstSecondThirdLast', '[A-Z]')")) { + assertEquals(4, result.getSize()); + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("first", r); + } + try (final Resource resource = result.getResource(1)) { + String r = (String) resource.getContent(); + assertEquals("econd", r); + } + try (final Resource resource = result.getResource(2)) { + String r = (String) resource.getContent(); + assertEquals("hird", r); + } + try (final Resource resource = result.getResource(3)) { + String r = (String) resource.getContent(); + assertEquals("ast", r); + } + } } @Test public void deepEqual() throws XMLDBException { - ResourceSet result = existEmbeddedServer.executeQuery( + try (final EXistResourceSet result = existEmbeddedServer.executeQuery( "let $res := ('a', 'b')" + "let $reference := ('a', 'b')" + - "return fn:deep-equal($res, $reference)"); - String r = (String) result.getResource(0).getContent(); - assertEquals("true", r); + "return fn:deep-equal($res, $reference)")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("true", r); + } + } } @Test public void compare() throws XPathException, XMLDBException { - ResourceSet result = existEmbeddedServer.executeQuery("fn:compare(\"Strasse\", \"Stra\u00DFe\")"); - String r = (String) result.getResource(0).getContent(); - assertEquals("-1", r); - //result = existEmbeddedServer.executeQuery("fn:compare(\"Strasse\", \"Stra\u00DFe\", \"java:GermanCollator\")"); - //r = (String) result.getResource(0).getContent(); - //assertEquals( "0", r ); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:compare(\"Strasse\", \"Stra\u00DFe\")")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("-1", r); + //result = existEmbeddedServer.executeQuery("fn:compare(\"Strasse\", \"Stra\u00DFe\", \"java:GermanCollator\")"); + //r = (String) result.getResource(0).getContent(); + //assertEquals( "0", r ); + } + } - String query = "let $a := -1-2 " + - "return $a/b[compare(., '+') gt 0]"; - result = existEmbeddedServer.executeQuery(query); - assertEquals(2, result.getSize()); + final String query = "let $a := -1-2 " + + "return $a/b[compare(., '+') gt 0]"; + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, result.getSize()); + } } @Test public void distinctValues() throws XMLDBException { - ResourceSet result = existEmbeddedServer.executeQuery("declare variable $c := distinct-values(('a', 'a')); $c"); - String r = (String) result.getResource(0).getContent(); - assertEquals("a", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("declare variable $c := distinct-values(('a', 'a')); $c")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("a", r); + } + } - result = existEmbeddedServer.executeQuery("declare variable $c := distinct-values((a, a)); $c"); - r = (String) result.getResource(0).getContent(); - assertEquals("a", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("declare variable $c := distinct-values((a, a)); $c")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("a", r); + } + } - result = existEmbeddedServer.executeQuery("let $seq := ('A', 2, 'B', 2) return distinct-values($seq) "); - assertEquals(3, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("let $seq := ('A', 2, 'B', 2) return distinct-values($seq) ")) { + assertEquals(3, result.getSize()); + } - String query = "let $a := -1-2 " + + final String query = "let $a := -1-2 " + "return $a/b[distinct-values(.)]"; - result = existEmbeddedServer.executeQuery(query); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, result.getSize()); + } } @Test public void sum() throws XMLDBException { - ResourceSet result = existEmbeddedServer.executeQuery("declare variable $c := sum((1, 2)); $c"); - String r = (String) result.getResource(0).getContent(); - assertEquals("3", r); - - result = existEmbeddedServer.executeQuery("declare variable $c := sum((1, 2)); $c"); - r = (String) result.getResource(0).getContent(); - //Any untyped atomic values in the sequence are converted to xs:double values ([MK Xpath 2.0], p. 432) - assertEquals("3", r); - - result = existEmbeddedServer.executeQuery("declare variable $c := sum((), 3); $c"); - r = (String) result.getResource(0).getContent(); - assertEquals("3", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("declare variable $c := sum((1, 2)); $c")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("3", r); + } + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("declare variable $c := sum((1, 2)); $c")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + //Any untyped atomic values in the sequence are converted to xs:double values ([MK Xpath 2.0], p. 432) + assertEquals("3", r); + } + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("declare variable $c := sum((), 3); $c")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("3", r); + } + } } @Test public void avg() throws XMLDBException { - ResourceSet result = existEmbeddedServer.executeQuery("avg((2, 2))"); - String r = (String) result.getResource(0).getContent(); - assertEquals("2", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("avg((2, 2))")) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("2", r); + } + } - result = existEmbeddedServer.executeQuery("avg((2, 2))"); - r = (String) result.getResource(0).getContent(); - //Any untyped atomic values in the resulting sequence - //(typically, values extracted from nodes in a schemaless document) - //are converted to xs:double values ([MK Xpath 2.0], p. 301) - assertEquals("2", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("avg((2, 2))")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + //Any untyped atomic values in the resulting sequence + //(typically, values extracted from nodes in a schemaless document) + //are converted to xs:double values ([MK Xpath 2.0], p. 301) + assertEquals("2", r); + } + } - result = existEmbeddedServer.executeQuery("avg((3, 4, 5))"); - r = (String) result.getResource(0).getContent(); - assertEquals("4", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("avg((3, 4, 5))")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("4", r); + } + } - result = existEmbeddedServer.executeQuery("avg((xdt:yearMonthDuration('P20Y'), xdt:yearMonthDuration('P10M')))"); - r = (String) result.getResource(0).getContent(); - assertEquals("P10Y5M", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("avg((xdt:yearMonthDuration('P20Y'), xdt:yearMonthDuration('P10M')))")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("P10Y5M", r); + } + } String message = ""; - try { - result = existEmbeddedServer.executeQuery("avg((xdt:yearMonthDuration('P20Y') , (3, 4, 5)))"); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("avg((xdt:yearMonthDuration('P20Y') , (3, 4, 5)))")) { + // needed to make sure result is closed } catch (XMLDBException e) { message = e.getMessage(); } assertTrue(message.contains("FORG0006")); - result = existEmbeddedServer.executeQuery("avg(())"); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("avg(())")) { + assertEquals(0, result.getSize()); + } - result = existEmbeddedServer.executeQuery("avg(((xs:float('INF')), xs:float('-INF')))"); - r = (String) result.getResource(0).getContent(); - assertEquals("NaN", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("avg(((xs:float('INF')), xs:float('-INF')))")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("NaN", r); + } + } - result = existEmbeddedServer.executeQuery("avg(((3, 4, 5), xs:float('NaN')))"); - r = (String) result.getResource(0).getContent(); - assertEquals("NaN", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("avg(((3, 4, 5), xs:float('NaN')))")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("NaN", r); + } + } } @Test public void min() throws XPathException, XMLDBException { - ResourceSet result = existEmbeddedServer.executeQuery("min((1, 2))"); - String r = (String) result.getResource(0).getContent(); - assertEquals("1", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("min((1, 2))")) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("1", r); + } + } - result = existEmbeddedServer.executeQuery("min((1, 2))"); - r = (String) result.getResource(0).getContent(); - assertEquals("1", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("min((1, 2))")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("1", r); + } + } - result = existEmbeddedServer.executeQuery("min(())"); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("min(())")) { + assertEquals(0, result.getSize()); + } - result = existEmbeddedServer.executeQuery("min((xs:dateTime('2005-12-19T16:22:40.006+01:00'), xs:dateTime('2005-12-19T16:29:40.321+01:00')))"); - r = (String) result.getResource(0).getContent(); - assertEquals("2005-12-19T16:22:40.006+01:00", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("min((xs:dateTime('2005-12-19T16:22:40.006+01:00'), xs:dateTime('2005-12-19T16:29:40.321+01:00')))")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("2005-12-19T16:22:40.006+01:00", r); + } + } - result = existEmbeddedServer.executeQuery("min(('a', 'b'))"); - r = (String) result.getResource(0).getContent(); - assertEquals("a", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("min(('a', 'b'))")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("a", r); + } + } String message = ""; try { - result = existEmbeddedServer.executeQuery("min((xs:dateTime('2005-12-19T16:22:40.006+01:00'), 'a'))"); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("min((xs:dateTime('2005-12-19T16:22:40.006+01:00'), 'a'))")) { + // needed to make sure result is closed + } } catch (XMLDBException e) { message = e.getMessage(); } @@ -323,37 +418,54 @@ public void min() throws XPathException, XMLDBException { try { message = ""; - result = existEmbeddedServer.executeQuery("min(1, 2)"); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("min(1, 2)")) { + // needed to make sure result is closed + } } catch (XMLDBException e) { message = e.getMessage(); } - //depends whether we have strict type checking or not + //depends on whether we have strict type checking or not assertTrue(message.contains("XPTY0004") | message.contains("FORG0001") | message.contains("FOCH0002")); } public void max() throws XPathException, XMLDBException { - ResourceSet result = existEmbeddedServer.executeQuery("max((1, 2))"); - String r = (String) result.getResource(0).getContent(); - assertEquals("2", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("max((1, 2))")) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("2", r); + } + } - result = existEmbeddedServer.executeQuery("max((1, 2))"); - r = (String) result.getResource(0).getContent(); - assertEquals("2", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("max((1, 2))")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("2", r); + } + } - result = existEmbeddedServer.executeQuery("max(())"); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("max(())")) { + assertEquals(0, result.getSize()); + } - result = existEmbeddedServer.executeQuery("max((xs:dateTime('2005-12-19T16:22:40.006+01:00'), xs:dateTime('2005-12-19T16:29:40.321+01:00')))"); - r = (String) result.getResource(0).getContent(); - assertEquals("2005-12-19T16:29:40.321+01:00", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("max((xs:dateTime('2005-12-19T16:22:40.006+01:00'), xs:dateTime('2005-12-19T16:29:40.321+01:00')))")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("2005-12-19T16:29:40.321+01:00", r); + } + } - result = existEmbeddedServer.executeQuery("max(('a', 'b'))"); - r = (String) result.getResource(0).getContent(); - assertEquals("b", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("max(('a', 'b'))")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("b", r); + } + } String message = ""; try { - result = existEmbeddedServer.executeQuery("max((xs:dateTime('2005-12-19T16:22:40.006+01:00'), 'a'))"); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("max((xs:dateTime('2005-12-19T16:22:40.006+01:00'), 'a'))")) { + // needed to make sure result is closed + } } catch (XMLDBException e) { message = e.getMessage(); } @@ -361,11 +473,13 @@ public void max() throws XPathException, XMLDBException { try { message = ""; - result = existEmbeddedServer.executeQuery("max(1, 2)"); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("max(1, 2)")) { + // needed to make sure result is closed + } } catch (XMLDBException e) { message = e.getMessage(); } - //depends whether we have strict type checking or not + //depends on whether we have strict type checking or not assertTrue(message.contains("XPTY0004") | message.contains("FORG0001") | message.contains("FOCH0002")); } @@ -375,54 +489,79 @@ public void exclusiveLock() throws XMLDBException { "let $query2 := (2, 3)\n" + "let $a := util:exclusive-lock(//*,($query1, $query2))\n" + "return $a"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(3, result.getSize()); - String r = (String) result.getResource(0).getContent(); - assertEquals("", r); - r = (String) result.getResource(1).getContent(); - assertEquals("2", r); - r = (String) result.getResource(2).getContent(); - assertEquals("3", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(3, result.getSize()); + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("", r); + } + try (final Resource resource = result.getResource(1)) { + String r = (String) resource.getContent(); + assertEquals("2", r); + } + try (final Resource resource = result.getResource(2)) { + String r = (String) resource.getContent(); + assertEquals("3", r); + } + } query = "let $query1 := ()\n" + "let $query2 := (2, 3)\n" + "let $a := util:exclusive-lock((),($query1, $query2))\n" + "return $a"; - result = existEmbeddedServer.executeQuery(query); - assertEquals(3, result.getSize()); - r = (String) result.getResource(0).getContent(); - assertEquals("", r); - r = (String) result.getResource(1).getContent(); - assertEquals("2", r); - r = (String) result.getResource(2).getContent(); - assertEquals("3", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(3, result.getSize()); + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("", r); + } + try (final Resource resource = result.getResource(1)) { + String r = (String) resource.getContent(); + assertEquals("2", r); + } + try (final Resource resource = result.getResource(2)) { + String r = (String) resource.getContent(); + assertEquals("3", r); + } + } query = "let $query1 := ()\n" + "let $query2 := (2, 3)\n" + "let $a := util:exclusive-lock((),($query1, $query2))\n" + "return $a"; - result = existEmbeddedServer.executeQuery(query); - assertEquals(3, result.getSize()); - r = (String) result.getResource(0).getContent(); - assertEquals("", r); - r = (String) result.getResource(1).getContent(); - assertEquals("2", r); - r = (String) result.getResource(2).getContent(); - assertEquals("3", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(3, result.getSize()); + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("", r); + } + try (final Resource resource = result.getResource(1)) { + String r = (String) resource.getContent(); + assertEquals("2", r); + } + try (final Resource resource = result.getResource(2)) { + String r = (String) resource.getContent(); + assertEquals("3", r); + } + } query = "let $a := util:exclusive-lock(//*,)\n" + "return $a"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals("", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("", r); + } + } } @Ignore @Test public void utilEval1() throws XMLDBException { String query = "/util:eval('*')"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + } } /** @@ -433,21 +572,22 @@ public void utilEval2() throws XMLDBException { String query = "let $context := " + "return util:eval(\"{$context}\")"; // TODO check result - ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + } } @Test public void utilEvalForFunction() throws XMLDBException { - String query = "declare function local:home()\n" + "{\n" + "HOME\n" + "};\n" + "util:eval(\"local:home()\")\n"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + } } @Test @@ -456,46 +596,70 @@ public void sharedLock() throws XMLDBException { "let $query2 := (2, 3)\n" + "let $a := util:shared-lock(//*,($query1, $query2))\n" + "return $a"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(3, result.getSize()); - String r = (String) result.getResource(0).getContent(); - assertEquals("", r); - r = (String) result.getResource(1).getContent(); - assertEquals("2", r); - r = (String) result.getResource(2).getContent(); - assertEquals("3", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(3, result.getSize()); + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("", r); + } + try (final Resource resource = result.getResource(1)) { + String r = (String) resource.getContent(); + assertEquals("2", r); + } + try (final Resource resource = result.getResource(2)) { + String r = (String) resource.getContent(); + assertEquals("3", r); + } + } query = "let $query1 := ()\n" + "let $query2 := (2, 3)\n" + "let $a := util:shared-lock((),($query1, $query2))\n" + "return $a"; - result = existEmbeddedServer.executeQuery(query); - assertEquals(3, result.getSize()); - r = (String) result.getResource(0).getContent(); - assertEquals("", r); - r = (String) result.getResource(1).getContent(); - assertEquals("2", r); - r = (String) result.getResource(2).getContent(); - assertEquals("3", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(3, result.getSize()); + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("", r); + } + try (final Resource resource = result.getResource(1)) { + String r = (String) resource.getContent(); + assertEquals("2", r); + } + try (final Resource resource = result.getResource(2)) { + String r = (String) resource.getContent(); + assertEquals("3", r); + } + } query = "let $query1 := ()\n" + "let $query2 := (2, 3)\n" + "let $a := util:shared-lock((),($query1, $query2))\n" + "return $a"; - result = existEmbeddedServer.executeQuery(query); - assertEquals(3, result.getSize()); - r = (String) result.getResource(0).getContent(); - assertEquals("", r); - r = (String) result.getResource(1).getContent(); - assertEquals("2", r); - r = (String) result.getResource(2).getContent(); - assertEquals("3", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(3, result.getSize()); + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("", r); + } + try (final Resource resource = result.getResource(1)) { + String r = (String) resource.getContent(); + assertEquals("2", r); + } + try (final Resource resource = result.getResource(2)) { + String r = (String) resource.getContent(); + assertEquals("3", r); + } + } query = "let $a := util:shared-lock(//*,)\n" + "return $a"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals("", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("", r); + } + } } @Test @@ -503,29 +667,38 @@ public void encodeForURI() throws XMLDBException { String string = "http://www.example.com/00/Weather/CA/Los%20Angeles#ocean"; String expected = "http%3A%2F%2Fwww.example.com%2F00%2FWeather%2FCA%2FLos%2520Angeles%23ocean"; String query = "encode-for-uri(\"" + string + "\")"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - String r = (String) result.getResource(0).getContent(); - assertEquals(expected, r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals(expected, r); + } + } string = "~b\u00e9b\u00e9"; expected = "~b%C3%A9b%C3%A9"; query = "encode-for-uri(\"" + string + "\")"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals(expected, r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals(expected, r); + } + } string = "100% organic"; expected = "100%25%20organic"; query = "encode-for-uri(\"" + string + "\")"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals(expected, r); - + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals(expected, r); + } + } query = "let $a := -1-2 " + "return $a/b[encode-for-uri(.) ne '']"; - result = existEmbeddedServer.executeQuery(query); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, result.getSize()); + } } @Test @@ -533,24 +706,32 @@ public void iriToURI() throws XMLDBException { String string = "http://www.example.com/00/Weather/CA/Los%20Angeles#ocean"; String expected = "http://www.example.com/00/Weather/CA/Los%20Angeles#ocean"; String query = "iri-to-uri(\"" + string + "\")"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - String r = (String) result.getResource(0).getContent(); - assertEquals(expected, r); - + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals(expected, r); + } + } string = "http://www.example.com/~b\u00e9b\u00e9"; expected = "http://www.example.com/~b%C3%A9b%C3%A9"; query = "iri-to-uri(\"" + string + "\")"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals(expected, r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals(expected, r); + } + } string = "$"; expected = "$"; query = "iri-to-uri(\"" + string + "\")"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals(expected, r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals(expected, r); + } + } } @Test @@ -558,155 +739,183 @@ public void escapeHTMLURI() throws XMLDBException { String string = "http://www.example.com/00/Weather/CA/Los Angeles#ocean"; String expected = "http://www.example.com/00/Weather/CA/Los Angeles#ocean"; String query = "escape-html-uri(\"" + string + "\")"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - String r = (String) result.getResource(0).getContent(); - assertEquals(expected, r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals(expected, r); + } + } string = "javascript:if (navigator.browserLanguage == 'fr') window.open('http://www.example.com/~b\u00e9b\u00e9');"; expected = "javascript:if (navigator.browserLanguage == 'fr') window.open('http://www.example.com/~b%C3%A9b%C3%A9');"; query = "escape-html-uri(\"" + string + "\")"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals(expected, r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals(expected, r); + } + } query = "escape-html-uri('$')"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals("$", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("$", r); + } + } query = "let $a := -1-2 " + "return $a/b[escape-html-uri(.) ne '']"; - result = existEmbeddedServer.executeQuery(query); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, result.getSize()); + } } @Test public void localName() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "let $a := " + - "return fn:local-name($a)"); - String r = (String) result.getResource(0).getContent(); - assertEquals("a", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("let $a := return fn:local-name($a)")) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("a", r); + } + } } @Test public void localName_empty() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "fn:local-name(())"); - final String r = (String) result.getResource(0).getContent(); - assertEquals("", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:local-name(())")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("", r); + } + } } @Test public void localName_emptyElement() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "b/fn:local-name(c)"); - final String r = (String) result.getResource(0).getContent(); - assertEquals("", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("b/fn:local-name(c)")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("", r); + } + } } @Test public void localName_emptyText() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "b/fn:local-name(text())"); - final String r = (String) result.getResource(0).getContent(); - assertEquals("", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("b/fn:local-name(text())")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("", r); + } + } } @Test public void localName_contextItem() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "let $a := " + - "return $a/b/fn:local-name()"); - final String r = (String) result.getResource(0).getContent(); - assertEquals("b", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("let $a := return $a/b/fn:local-name()")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("b", r); + } + } } @Test public void localName_contextItem_empty() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "let $a := " + - "return $a/b/c/fn:local-name()"); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("let $a := return $a/b/c/fn:local-name()")) { + assertEquals(0, result.getSize()); + } } @Test public void name() throws XPathException, XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "let $a := " + - "return fn:name($a)"); - String r = (String) result.getResource(0).getContent(); - assertEquals("a", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("let $a := return fn:name($a)")) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("a", r); + } + } } @Test public void name_empty() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "fn:name(())"); - final String r = (String) result.getResource(0).getContent(); - assertEquals("", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:name(())")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("", r); + } + } } @Test public void name_emptyElement() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "b/fn:name(c)"); - final String r = (String) result.getResource(0).getContent(); - assertEquals("", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("b/fn:name(c)")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("", r); + } + } } @Test public void name_emptyText() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "b/fn:local-name(text())"); - final String r = (String) result.getResource(0).getContent(); - assertEquals("", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("b/fn:local-name(text())")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("", r); + } + } } @Test public void name_contextItem() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "let $a := " + - "return $a/b/fn:name()"); - final String r = (String) result.getResource(0).getContent(); - assertEquals("b", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("let $a := return $a/b/fn:name()")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("b", r); + } + } } @Test public void name_contextItem_empty() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "let $a := " + - "return $a/b/c/fn:name()"); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("let $a := return $a/b/c/fn:name()")) { + assertEquals(0, result.getSize()); + } } @Test public void dateTimeConstructor() throws XMLDBException { - ResourceSet result = existEmbeddedServer.executeQuery( - "let $date := xs:date('2007-05-02+02:00') " + - "return dateTime($date, xs:time('15:12:52.421+02:00'))" - ); - String r = (String) result.getResource(0).getContent(); - assertEquals("2007-05-02T15:12:52.421+02:00", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("let $date := xs:date('2007-05-02+02:00') return dateTime($date, xs:time('15:12:52.421+02:00'))")) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("2007-05-02T15:12:52.421+02:00", r); + } + } } @Test public void currentDateTime() throws XMLDBException { //Do not use this test around midnight on the last day of a month ;-) - ResourceSet result = existEmbeddedServer.executeQuery( - "('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', " + - "'Oct', 'Nov', 'Dec')[month-from-dateTime(current-dateTime())]"); - String r = (String) result.getResource(0).getContent(); - SimpleDateFormat df = new SimpleDateFormat("MMM", new Locale("en", "US")); - Date date = new Date(); - assertEquals(df.format(date), r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[month-from-dateTime(current-dateTime())]")) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + SimpleDateFormat df = new SimpleDateFormat("MMM", new Locale("en", "US")); + Date date = new Date(); + assertEquals(df.format(date), r); + } + } String query = "declare option exist:current-dateTime '2007-08-23T00:01:02.062+02:00';" + "current-dateTime()"; - result = existEmbeddedServer.executeQuery(query); - assertEquals(1, result.getSize()); - r = (String) result.getResource(0).getContent(); - assertEquals("2007-08-23T00:01:02.062+02:00", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("2007-08-23T00:01:02.062+02:00", r); + } + } } /** @@ -719,13 +928,19 @@ public void currentDateTime() throws XMLDBException { */ @Test public void secondsFromDateTime() throws XMLDBException { - ResourceSet result = existEmbeddedServer.executeQuery("seconds-from-dateTime(xs:dateTime(\"2005-12-22T13:35:21.000\") )"); - String r = (String) result.getResource(0).getContent(); - assertEquals("21", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("seconds-from-dateTime(xs:dateTime(\"2005-12-22T13:35:21.000\") )")) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("21", r); + } + } - result = existEmbeddedServer.executeQuery("seconds-from-dateTime(xs:dateTime(\"2005-12-22T13:35:21\") )"); - r = (String) result.getResource(0).getContent(); - assertEquals("21", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("seconds-from-dateTime(xs:dateTime(\"2005-12-22T13:35:21\") )")) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("21", r); + } + } } @Test @@ -736,18 +951,24 @@ public void resolveQName() throws XMLDBException { "for $e in $d/d " + "return fn:resolve-QName($e/text(), $e)"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - String r = (String) result.getResource(0).getContent(); - assertEquals("x:test", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("x:test", r); + } + } query = "declare namespace a=\"aes\"; " + "declare namespace n=\"ns1\"; " + "declare variable $d := y:test; " + "for $e in $d/d " + "return fn:resolve-QName($e/text(), $e)"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals("y:test", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("y:test", r); + } + } } @Test @@ -755,37 +976,47 @@ public void namespaceURI() throws XMLDBException { String query = "let $var := " + "return " + "$var[fn:namespace-uri() = 'aaa']/fn:namespace-uri()"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - String r = (String) result.getResource(0).getContent(); - assertEquals("aaa", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("aaa", r); + } + } query = "for $a in //* " + "return namespace-uri($a)"; - result = existEmbeddedServer.executeQuery(query); - assertEquals(result.getSize(), 3); - r = (String) result.getResource(0).getContent(); - assertEquals("aaa", r); - r = (String) result.getResource(1).getContent(); - assertEquals("aaa", r); - r = (String) result.getResource(2).getContent(); - assertEquals("aaa", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(result.getSize(), 3); + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("aaa", r); + } + try (final Resource resource = result.getResource(1)) { + String r = (String) resource.getContent(); + assertEquals("aaa", r); + } + try (final Resource resource = result.getResource(2)) { + String r = (String) resource.getContent(); + assertEquals("aaa", r); + } + } } @Test public void namespaceURI_contextItem() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "let $a := " + - "return $a/exist:b/fn:namespace-uri()"); - final String r = (String) result.getResource(0).getContent(); - assertEquals("http://exist.sourceforge.net/NS/exist", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("let $a := return $a/exist:b/fn:namespace-uri()")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("http://exist.sourceforge.net/NS/exist", r); + } + } } @Test public void namespaceURI_contextItem_empty() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "let $a := " + - "return $a/exist:b/c/fn:namespace-uri()"); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("let $a := return $a/exist:b/c/fn:namespace-uri()")) { + assertEquals(0, result.getSize()); + } } @Test @@ -793,18 +1024,24 @@ public void prefixFromQName() throws XMLDBException { String query = "declare namespace foo = \"http://example.org\"; " + "declare namespace FOO = \"http://example.org\"; " + "fn:prefix-from-QName(xs:QName(\"foo:bar\"))"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - String r = (String) result.getResource(0).getContent(); - assertEquals("foo", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("foo", r); + } + } } @Test public void stringJoin() throws XMLDBException { String query = "let $s := ('','a','b','') " + "return string-join($s,'/')"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - String r = (String) result.getResource(0).getContent(); - assertEquals("/a/b/", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("/a/b/", r); + } + } } @Test @@ -812,46 +1049,47 @@ public void nodeName() throws XMLDBException { final String query = "let $a := -1-2 " + "for $b in $a/b[fn:node-name(.) = xs:QName('b')] return $b"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, result.getSize()); + } } @Test public void noeName_empty() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "fn:node-name(())"); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:node-name(())")) { + assertEquals(0, result.getSize()); + } } @Test public void nodeName_emptyElement() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "b/fn:node-name(c)"); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("b/fn:node-name(c)")) { + assertEquals(0, result.getSize()); + } } @Test public void nodeName_emptyText() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "b/fn:node-name(text())"); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("b/fn:node-name(text())")) { + assertEquals(0, result.getSize()); + } } @Test public void nodeName_contextItem() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "let $a := " + - "return $a/b/fn:node-name()"); - final String r = (String) result.getResource(0).getContent(); - assertEquals("b", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("let $a := return $a/b/fn:node-name()")) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("b", r); + } + } } @Test public void nodeName_contextItem_empty() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery( - "let $a := " + - "return $a/b/c/fn:node-name()"); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("let $a := return $a/b/c/fn:node-name()")) { + assertEquals(0, result.getSize()); + } } @Test @@ -859,18 +1097,24 @@ public void data0() throws XMLDBException { final String query = "let $a := 11 " + "for $b in $a/b[data() = '1'] return $b"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, result.getSize()); + } } @Test public void data0_atomization() throws XMLDBException { final String query = "(12three, 4)/data()"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(2, result.getSize()); - assertEquals("12three", result.getResource(0).getContent().toString()); - assertEquals("4", result.getResource(1).getContent()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("12three", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("4", resource.getContent()); + } + } } @Test @@ -878,19 +1122,27 @@ public void data1() throws XMLDBException { final String query = "let $a := 11 " + "for $b in $a/b[data() = '1'] return $b"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, result.getSize()); + } } @Test public void data1_atomization() throws XMLDBException { final String query = "data((12three, 4, xs:integer(5)))"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(3, result.getSize()); - assertEquals("12three", result.getResource(0).getContent().toString()); - assertEquals("4", result.getResource(1).getContent()); - assertEquals("5", result.getResource(2).getContent()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(3, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("12three", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("4", resource.getContent()); + } + try (final Resource resource = result.getResource(2)) { + assertEquals("5", resource.getContent()); + } + } } @Test @@ -898,8 +1150,9 @@ public void ceiling() throws XMLDBException { String query = "let $a := -1-2 " + "return $a/b[abs(ceiling(.))]"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, result.getSize()); + } } @Test @@ -907,8 +1160,9 @@ public void concat() throws XMLDBException { String query = "let $a := -1-2 " + "return $a/b[concat('+', ., '+') = '+-2+']"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + } } @Test @@ -916,8 +1170,9 @@ public void documentURI() throws XMLDBException { String query = "let $a := -1-2 " + "return $a/b[empty(document-uri(.))]"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, result.getSize()); + } } @Test @@ -925,10 +1180,13 @@ public void implicitTimezone() throws XMLDBException { String query = "declare option exist:implicit-timezone 'PT3H';" + "implicit-timezone()"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(1, result.getSize()); - String r = (String) result.getResource(0).getContent(); - assertEquals("PT3H", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + String r = (String) resource.getContent(); + assertEquals("PT3H", r); + } + } } @Test @@ -936,9 +1194,9 @@ public void exists() throws XMLDBException { String query = "let $a := -1-2 " + "return $a/b[exists(.)]"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(2, result.getSize()); - + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, result.getSize()); + } } @Test @@ -946,8 +1204,9 @@ public void floor() throws XMLDBException { String query = "let $a := -1-2 " + "return $a/b[abs(floor(.))]"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - assertEquals(2, result.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, result.getSize()); + } } /** @@ -985,7 +1244,7 @@ public void collectionAvailable2() throws XMLDBException { Collection testCollection = existEmbeddedServer.getRoot().getChildCollection(collectionName); if (testCollection == null) { CollectionManagementService cms = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - cms.createCollection(collectionPath); + try (final Collection created = cms.createCollection(collectionPath)) { } } runCollectionAvailableTest(collectionPath, true); @@ -997,13 +1256,16 @@ private void runCollectionAvailableTest(String collectionPath, boolean expectedR String importXMLDB = "import module namespace xdb=\"http://exist-db.org/xquery/xmldb\";\n"; String collectionAvailable = "xdb:collection-available('" + collectionPath + "')"; String query = importXMLDB + collectionAvailable; - ResourceSet result = existEmbeddedServer.executeQuery(query); - assertNotNull(result); - assertEquals(1, result.getSize()); - assertNotNull(result.getResource(0)); - String content = (String) result.getResource(0).getContent(); - assertNotNull(content); - assertEquals(expectedResult, Boolean.valueOf(content)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertNotNull(result); + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertNotNull(resource); + String content = (String) resource.getContent(); + assertNotNull(content); + assertEquals(expectedResult, Boolean.valueOf(content)); + } + } } @Test @@ -1015,65 +1277,85 @@ public void base64BinaryCast() throws XMLDBException, URISyntaxException { //create a test collection CollectionManagementService colService = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - Collection testCollection = colService.createCollection(TEST_BINARY_COLLECTION); - assertNotNull(testCollection); - - final Path fLogo = Paths.get(getClass().getResource("value/logo.png").toURI()); - - //store the eXist logo in the test collection - BinaryResource br = testCollection.createResource(BINARY_RESOURCE_FILENAME, BinaryResource.class); - br.setContent(fLogo); - testCollection.storeResource(br); - - //create an XML resource with the logo base64 embedded in it - String queryStore = "xquery version \"1.0\";\n\n" - + "let $embedded := {util:binary-doc(\"" + TEST_COLLECTION + "/" + BINARY_RESOURCE_FILENAME + "\")} return\n" - + "xmldb:store(\"" + TEST_COLLECTION + "\", \"" + XML_RESOURCE_FILENAME + "\", $embedded)"; - - ResourceSet resultStore = existEmbeddedServer.executeQuery(queryStore); - assertEquals("store, Expect single result", 1, resultStore.getSize()); - assertEquals("Expect stored filename as result", TEST_COLLECTION + "/" + XML_RESOURCE_FILENAME, resultStore.getResource(0).getContent().toString()); - - //retrieve the base64 image from the XML resource and try to cast to xs:base64Binary - String queryRetreive = "xquery version \"1.0\";\n\n" - + "let $image := doc(\"" + TEST_COLLECTION + "/" + XML_RESOURCE_FILENAME + "\")/logo/image return\n" - + "$image/text() cast as xs:base64Binary"; - - ResourceSet resultRetreive = existEmbeddedServer.executeQuery(queryRetreive); - assertEquals("retreive, Expect single result", 1, resultRetreive.getSize()); + try (final Collection testCollection = colService.createCollection(TEST_BINARY_COLLECTION)) { + assertNotNull(testCollection); + + final Path fLogo = Paths.get(getClass().getResource("value/logo.png").toURI()); + + //store the eXist logo in the test collection + try (final BinaryResource br = testCollection.createResource(BINARY_RESOURCE_FILENAME, BinaryResource.class)) { + br.setContent(fLogo); + testCollection.storeResource(br); + } + + //create an XML resource with the logo base64 embedded in it + String queryStore = "xquery version \"1.0\";\n\n" + + "let $embedded := {util:binary-doc(\"" + TEST_COLLECTION + "/" + BINARY_RESOURCE_FILENAME + "\")} return\n" + + "xmldb:store(\"" + TEST_COLLECTION + "\", \"" + XML_RESOURCE_FILENAME + "\", $embedded)"; + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(queryStore)) { + assertEquals("store, Expect single result", 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("Expect stored filename as result", TEST_COLLECTION + "/" + XML_RESOURCE_FILENAME, resource.getContent().toString()); + } + } + + //retrieve the base64 image from the XML resource and try to cast to xs:base64Binary + String queryRetreive = "xquery version \"1.0\";\n\n" + + "let $image := doc(\"" + TEST_COLLECTION + "/" + XML_RESOURCE_FILENAME + "\")/logo/image return\n" + + "$image/text() cast as xs:base64Binary"; + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(queryRetreive)) { + assertEquals("retreive, Expect single result", 1, result.getSize()); + } + } } @Test public void defaultLanguage() throws XMLDBException { - - final ResourceSet result = existEmbeddedServer.executeQuery("default-language()"); - assertEquals(1, result.getSize()); - final String defaultLanguage = (String) result.getResource(0).getContent(); - assertEquals(Locale.getDefault().getLanguage(), defaultLanguage); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("default-language()")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + final String defaultLanguage = (String) resource.getContent(); + assertEquals(Locale.getDefault().getLanguage(), defaultLanguage); + } + } } @Test public void enclosedExpression() throws XMLDBException { - ResourceSet result = existEmbeddedServer.executeQuery("{()}{123}"); - assertEquals(1, result.getSize()); - String text = (String) result.getResource(0).getContent(); - assertEquals("123", text); - - result = existEmbeddedServer.executeQuery("{(), 123}"); - assertEquals(1, result.getSize()); - text = (String) result.getResource(0).getContent(); - assertEquals("123", text); - - result = existEmbeddedServer.executeQuery("{()}123"); - assertEquals(1, result.getSize()); - text = (String) result.getResource(0).getContent(); - assertEquals("123", text); - - result = existEmbeddedServer.executeQuery("{'time '}{()}{'is: '}{current-time()}"); - assertEquals(1, result.getSize()); - text = (String) result.getResource(0).getContent(); - assertTrue(text.startsWith("time is: ")); - assertTrue(text.length() > 35); - assertTrue(text.endsWith("")); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("{()}{123}")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + final String text = (String) resource.getContent(); + assertEquals("123", text); + } + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("{(), 123}")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + final String text = (String) resource.getContent(); + assertEquals("123", text); + } + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("{()}123")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + final String text = (String) resource.getContent(); + assertEquals("123", text); + } + } + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("{'time '}{()}{'is: '}{current-time()}")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + final String text = (String) resource.getContent(); + assertTrue(text.startsWith("time is: ")); + assertTrue(text.length() > 35); + assertTrue(text.endsWith("")); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/XQueryProcessingInstructionTest.java b/exist-core/src/test/java/org/exist/xquery/XQueryProcessingInstructionTest.java index 8786425ae5..c1b9c85226 100644 --- a/exist-core/src/test/java/org/exist/xquery/XQueryProcessingInstructionTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XQueryProcessingInstructionTest.java @@ -46,10 +46,11 @@ package org.exist.xquery; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmlunit.matchers.CompareMatcher; @@ -72,8 +73,11 @@ public void testPI() throws XMLDBException { "" + "return\n" + "$xml"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - final String result = (String) results.getResource(0).getContent(); - assertThat(result, CompareMatcher.isIdenticalTo("This is a p.")); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = results.getResource(0)) { + final String result = (String) resource.getContent(); + assertThat(result, CompareMatcher.isIdenticalTo("This is a p.")); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/XQueryTest.java b/exist-core/src/test/java/org/exist/xquery/XQueryTest.java index 91415d7bfb..7cad3979f0 100644 --- a/exist-core/src/test/java/org/exist/xquery/XQueryTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XQueryTest.java @@ -56,6 +56,7 @@ import org.exist.storage.DBBroker; import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.xmldb.EXistResource; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.EXistXPathQueryService; import org.exist.xmldb.XmldbURI; import org.exist.xquery.value.IntegerValue; @@ -69,7 +70,6 @@ import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.*; import org.xmlunit.builder.DiffBuilder; @@ -190,7 +190,7 @@ public class XQueryTest { public void setup() throws XMLDBException { final CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - service.createCollection("test"); + try (final Collection created = service.createCollection("test")) { } } @After @@ -206,25 +206,24 @@ private Collection getTestCollection() throws XMLDBException { @Test public void let() throws XMLDBException, IOException, SAXException { - ResourceSet result; - String query; - @SuppressWarnings("unused") - XMLResource resu; - - XPathQueryService service = - storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); + final XPathQueryService service = storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); //Non null context sequence - query = "/test/item[let $id := ./@id return $id]"; - result = service.queryResource(NUMBERS_XML, query); - assertEquals("XQuery: " + query, 4, result.getSize()); + String query = "/test/item[let $id := ./@id return $id]"; + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query)) { + assertEquals("XQuery: " + query, 4, result.getSize()); + } + query = "/test/item[let $id := ./@id return not(/test/set[@id=$id])]"; - result = service.queryResource(NUMBERS_XML, query); - assertEquals("XQuery: " + query, 4, result.getSize()); - query = "let $test := a a " + + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query)) { + assertEquals("XQuery: " + query, 4, result.getSize()); + query = "let $test := a a " + "return distinct-values($test/a/normalize-space(.))"; - result = service.queryResource(NUMBERS_XML, query); - assertEquals("XQuery: " + query, 1, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + } //Ordered value sequence query = "let $unordset := (for $val in reverse(1 to 100) return " + @@ -235,47 +234,57 @@ public void let() throws XMLDBException, IOException, SAXException { "return $newval/text()) " + "return $ordset/ancestor::node()"; - result = service.queryResource(NUMBERS_XML, query); - assertEquals("XQuery: " + query, 50, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query)) { + assertEquals("XQuery: " + query, 50, result.getSize()); - //WARNING : the return order CHANGES !!!!!!!!!!!!!!!!!! - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("99")); - assertThat(result.getResource(49).getContent().toString(), CompareMatcher.isIdenticalTo("1")); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("99")); + } + try (final Resource resource = result.getResource(49)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("1")); + } + } } @Test public void testFor() throws XMLDBException { - ResourceSet result; - String query; - XMLResource resu; - - XPathQueryService service = - storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); - query = "for $f in /*/item return $f"; - result = service.queryResource(NUMBERS_XML, query); - assertEquals("XQuery: " + query, 4, result.getSize()); + final XPathQueryService service = storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); + + String query = "for $f in /*/item return $f"; + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query)) { + assertEquals("XQuery: " + query, 4, result.getSize()); + } + query = "for $f in /*/item order by $f ascending return $f"; - result = service.queryResource(NUMBERS_XML, query); - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, "3", ((Element) resu.getContentAsDOM()).getAttribute("id")); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query); + final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, "3", ((Element) resource.getContentAsDOM()).getAttribute("id")); + } + query = "for $f in /*/item order by $f descending return $f"; - result = service.queryResource(NUMBERS_XML, query); - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, "2", ((Element) resu.getContentAsDOM()).getAttribute("id")); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query); + final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, "2", ((Element) resource.getContentAsDOM()).getAttribute("id")); + } + query = "for $f in /*/item order by xs:double($f/price) descending return $f"; - result = service.queryResource(NUMBERS_XML, query); - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, "4", ((Element) resu.getContentAsDOM()).getAttribute("id")); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query); + final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, "4", ((Element) resource.getContentAsDOM()).getAttribute("id")); + } + query = "for $f in //item where $f/@id = '3' return $f"; - result = service.queryResource(NUMBERS_XML, query); - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, "3", ((Element) resu.getContentAsDOM()).getAttribute("id")); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query); + final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, "3", ((Element) resource.getContentAsDOM()).getAttribute("id")); + } //Non null context sequence query = "/test/item[for $id in ./@id return $id]"; - result = service.queryResource(NUMBERS_XML, query); - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, 4, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query); + final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, 4, result.getSize()); + } //Ordered value sequence query = "let $doc := ZYX " + @@ -286,20 +295,22 @@ public void testFor() throws XMLDBException { "for $value in $doc/value " + " return $value[. = $ordered_values[position() = 1]]"; - result = service.queryResource(NUMBERS_XML, query); - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, "X", resu.getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query); + final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, "X", resource.getContent()); + } //Ordered value sequence query = "for $e in (1) order by $e return $e"; - result = service.queryResource(NUMBERS_XML, query); - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, "1", resu.getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query); + final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, "1", resource.getContent()); + } } @Test public void recursion() throws XMLDBException { - String q1 = + final String q1 = "declare function local:append($head, $i) {\n" + " if ($i < 5000) then\n" + " local:append(($head, $i), $i + 1)\n" + @@ -307,49 +318,57 @@ public void recursion() throws XMLDBException { " $head\n" + "};\n" + "local:append((), 0)"; - XPathQueryService service = - getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(q1); - assertEquals(result.getSize(), 5000); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(q1)) { + assertEquals(result.getSize(), 5000); + } + } } @Test public void constructedNode1() throws XMLDBException { - String q1 = - "let $a := for $b in $a//B/string() return \"Oops!\""; - XPathQueryService service = - getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(q1); - assertEquals(0, result.getSize()); + final String q1 = "let $a := for $b in $a//B/string() return \"Oops!\""; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(q1)) { + assertEquals(0, result.getSize()); + } + } } @Test public void combiningNodeSequences() throws XMLDBException { - ResourceSet result; - String query; - - XPathQueryService service = - getTestCollection().getService(XPathQueryService.class); - query = "let $a := \n" + - "let $aa := ($a, $a) \n" + - "for $b in ($aa intersect $aa \n)" + - "return $b"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); - query = "let $a := \n" + - "let $aa := ($a, $a) \n" + - "for $b in ($aa union $aa \n)" + - "return $b"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); - query = "let $a := \n" + - "let $aa := ($a, $a) \n" + - "for $b in ($aa except $aa \n)" + - "return $b"; - result = service.query(query); - assertEquals("XQuery: " + query, 0, result.getSize()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + String query = "let $a := \n" + + "let $aa := ($a, $a) \n" + + "for $b in ($aa intersect $aa \n)" + + "return $b"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + assertEquals("XQuery: " + query, "", resource.getContent()); + } + + query = "let $a := \n" + + "let $aa := ($a, $a) \n" + + "for $b in ($aa union $aa \n)" + + "return $b"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + assertEquals("XQuery: " + query, "", resource.getContent()); + } + + query = "let $a := \n" + + "let $aa := ($a, $a) \n" + + "for $b in ($aa except $aa \n)" + + "return $b"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 0, result.getSize()); + } + } } /** @@ -357,91 +376,124 @@ public void combiningNodeSequences() throws XMLDBException { */ @Test public void inMemoryNodeSequences() throws XMLDBException { - ResourceSet result; - String query; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); - XPathQueryService service = - getTestCollection().getService(XPathQueryService.class); - - query = "let $c := (,) return text{$c[1]}"; - result = service.query(query); - assertEquals("XQuery: " + query, "text\n", result.getResource(0).getContent()); + String query = "let $c := (,) return text{$c[1]}"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "text\n", resource.getContent()); + } - query = "let $c := (,) return {$c[1]}"; - result = service.query(query); - assertEquals("XQuery: " + query, "\n \n \n", result.getResource(0).getContent()); + query = "let $c := (,) return {$c[1]}"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "\n \n \n", resource.getContent()); + } - query = "let $c := (,) return {\"text\"}{$c[1]}"; - result = service.query(query); - assertEquals("XQuery: " + query, "text\n", result.getResource(0).getContent()); + query = "let $c := (,) return {\"text\"}{$c[1]}"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "text\n", resource.getContent()); + } - query = "let $c := (,\"b\") return text{$c[1]}"; - result = service.query(query); - assertEquals("XQuery: " + query, "text\n", result.getResource(0).getContent()); + query = "let $c := (,\"b\") return text{$c[1]}"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "text\n", resource.getContent()); + } - query = "let $c := (,\"b\") return {$c[1]}"; - result = service.query(query); - assertEquals("XQuery: " + query, "\n \n \n", result.getResource(0).getContent()); + query = "let $c := (,\"b\") return {$c[1]}"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "\n \n \n", resource.getContent()); + } - query = "let $c := (,\"b\") return {\"text\"}{$c[1]}"; - result = service.query(query); - assertEquals("XQuery: " + query, "text\n", result.getResource(0).getContent()); + query = "let $c := (,\"b\") return {\"text\"}{$c[1]}"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "text\n", resource.getContent()); + } - query = "let $c := (,) return {,$c[1]}"; - result = service.query(query); - assertEquals("XQuery: " + query, "\n \n \n", result.getResource(0).getContent()); + query = "let $c := (,) return {,$c[1]}"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "\n \n \n", resource.getContent()); + } - query = "let $c := (,) return {\"text\",$c[1]}"; - result = service.query(query); - assertEquals("XQuery: " + query, "text\n", result.getResource(0).getContent()); + query = "let $c := (,) return {\"text\",$c[1]}"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "text\n", resource.getContent()); + } - query = "let $c := (,\"b\") return {,$c[1]}"; - result = service.query(query); - assertEquals("XQuery: " + query, "\n \n \n", result.getResource(0).getContent()); + query = "let $c := (,\"b\") return {,$c[1]}"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "\n \n \n", resource.getContent()); + } - query = "let $c := (,\"b\") return {\"text\",$c[1]}"; - result = service.query(query); - assertEquals("XQuery: " + query, "text\n", result.getResource(0).getContent()); + query = "let $c := (,\"b\") return {\"text\",$c[1]}"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "text\n", resource.getContent()); + } + } } @Test public void variable() throws XMLDBException { - ResourceSet result; - String query; - XMLResource resu; - @SuppressWarnings("unused") - boolean exceptionThrown; - String message; - - XPathQueryService service = - storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); - query = "xquery version \"1.0\";\n" + "declare namespace param=\"param\";\n" + "declare variable $param:a := \"a\";\n" + "declare function param:a() {$param:a};\n" + "let $param:a := \"b\" \n" + "return ($param:a, $param:a)"; - result = service.query(query); - assertEquals("XQuery: " + query, 2, result.getSize()); - assertEquals("XQuery: " + query, "b", result.getResource(0).getContent()); - assertEquals("XQuery: " + query, "b", result.getResource(1).getContent()); + final XPathQueryService service = storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); + + String query = "xquery version \"1.0\";\n" + "declare namespace param=\"param\";\n" + "declare variable $param:a := \"a\";\n" + "declare function param:a() {$param:a};\n" + "let $param:a := \"b\" \n" + "return ($param:a, $param:a)"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "b", resource.getContent()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("XQuery: " + query, "b", resource.getContent()); + } + } + query = "xquery version \"1.0\";\n" + "declare namespace param=\"param\";\n" + "declare variable $param:a := \"a\";\n" + "declare function param:a() {$param:a};\n" + "let $param:a := \"b\" \n" + "return param:a(), param:a()"; - result = service.query(query); - assertEquals("XQuery: " + query, 2, result.getSize()); - assertEquals("XQuery: " + query, "a", result.getResource(0).getContent()); - assertEquals("XQuery: " + query, "a", result.getResource(1).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "a", resource.getContent()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("XQuery: " + query, "a", resource.getContent()); + } + } + query = "declare variable $foo := \"foo1\";\n" + "let $foo := \"foo2\" \n" + "for $bar in (1 to 1) \n" + " let $foo := \"foo3\" \n" + " return $foo"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "foo3", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "foo3", resource.getContent()); + } + } + String message = ""; try { - message = ""; query = "xquery version \"1.0\";\n" + "declare variable $a := \"1st instance\";\n" + "declare variable $a := \"2nd instance\";\n" + "$a"; - result = service.query(query); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to ensure that result is closed + } } catch (XMLDBException e) { message = e.getMessage(); } assertTrue(message.indexOf("XQST0049") > -1); + query = "xquery version \"1.0\";\n" + "declare namespace param=\"param\";\n" + "declare function param:f() { $param:a };\n" + "declare variable $param:a := \"a\";\n" + "param:f()"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "a", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "a", resource.getContent()); + } + } + query = "let $a := " + "" + " " + @@ -456,71 +508,65 @@ public void variable() throws XMLDBException { "where ($bar/../@name = 'x') " + "return $bar " + "return $b"; - result = service.queryResource(NUMBERS_XML, query); - assertEquals("XQuery: " + query, 2, result.getSize()); - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, "2", ((Element) resu.getContentAsDOM()).getAttribute("name")); - resu = (XMLResource) result.getResource(1); - assertEquals("XQuery: " + query, "3", ((Element) resu.getContentAsDOM()).getAttribute("name")); - } - - @Test - public void virtualNodesets() throws XMLDBException, IOException, SAXException { - ResourceSet result; - String query; - @SuppressWarnings("unused") - XMLResource resu; - @SuppressWarnings("unused") - boolean exceptionThrown; - @SuppressWarnings("unused") - String message; - - XPathQueryService service = - storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query)) { + assertEquals("XQuery: " + query, 2, result.getSize()); + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, "2", ((Element) resource.getContentAsDOM()).getAttribute("name")); + } + try (final XMLResource resource = (XMLResource) result.getResource(1)) { + assertEquals("XQuery: " + query, "3", ((Element) resource.getContentAsDOM()).getAttribute("name")); + } + } + } + + @Test + public void virtualNodesets() throws XMLDBException { + final XPathQueryService service = storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); service.setProperty(OutputKeys.INDENT, "no"); - query = "let $node := ()/descendant::*/attribute::id " + + String query = "let $node := ()/descendant::*/attribute::id " + "return {$node}"; - result = service.queryResource(NUMBERS_XML, query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("")); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } query = "let $node := ()/descendant-or-self::*/child::b " + "return {$node}"; - result = service.queryResource(NUMBERS_XML, query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("")); - + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } query = "let $node := ()/descendant-or-self::*/descendant::b " + "return {$node}"; - result = service.queryResource(NUMBERS_XML, query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("")); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } query = "let $doc := " + "return $doc/*/({@id})"; - result = service.queryResource(NUMBERS_XML, query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("")); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } } @Test public void whereClause() throws XMLDBException, IOException, SAXException { - ResourceSet result; - String query; - @SuppressWarnings("unused") - XMLResource resu; - @SuppressWarnings("unused") - boolean exceptionThrown; - @SuppressWarnings("unused") - String message; - - XPathQueryService service = - storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); + final XPathQueryService service = storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); service.setProperty(OutputKeys.INDENT, "no"); - query = "let $a := element node1 { " + + final String query = "let $a := element node1 { " + "attribute id {'id'}, " + "element node1 {'1'}, " + "element node2 {'2'} " + @@ -528,177 +574,221 @@ public void whereClause() throws XMLDBException, IOException, SAXException { "for $x in $a " + "where $x/@id eq 'id' " + "return $x"; - result = service.queryResource(NUMBERS_XML, query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("12")); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(NUMBERS_XML, query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("12")); + } + } } @Test public void typedVariables() throws XMLDBException { - ResourceSet result; - String query; - boolean exceptionThrown; - @SuppressWarnings("unused") - String message; - - XPathQueryService service = - storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); - query = "let $v as element()* := ( , )\n" + "let $w := { $v }\n" + "let $x as element()* := $w/assign\n" + "return $x"; - result = service.query(query); - assertEquals("XQuery: " + query, 2, result.getSize()); - assertEquals("XQuery: " + query, Node.ELEMENT_NODE, ((XMLResource) result.getResource(0)).getContentAsDOM().getNodeType()); - assertEquals("XQuery: " + query, "assign", ((XMLResource) result.getResource(0)).getContentAsDOM().getNodeName()); + final XPathQueryService service = storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); + + String query = "let $v as element()* := ( , )\n" + "let $w := { $v }\n" + "let $x as element()* := $w/assign\n" + "return $x"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 2, result.getSize()); + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, Node.ELEMENT_NODE, resource.getContentAsDOM().getNodeType()); + assertEquals("XQuery: " + query, "assign", resource.getContentAsDOM().getNodeName()); + } + } + query = "let $v as node()* := ()\n" + "return $v"; - result = service.query(query); - assertEquals("XQuery: " + query, 0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 0, result.getSize()); + } + query = "let $v as item()* := ()\n" + "return $v"; - result = service.query(query); - assertEquals("XQuery: " + query, 0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 0, result.getSize()); + } + query = "let $v as empty-sequence() := ()\n" + "return $v"; - result = service.query(query); - assertEquals("XQuery: " + query, 0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 0, result.getSize()); + } + query = "let $v as item() := ()\n" + "return $v"; - try { - exceptionThrown = false; - result = service.query(query); - } catch (XMLDBException e) { + String message = ""; + boolean exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure result is closed + } catch (final XMLDBException e) { exceptionThrown = true; message = e.getMessage(); } assertTrue("XQuery: " + query, exceptionThrown); + query = "let $v as item()* := ( , 1 )\n" + "return $v"; - result = service.query(query); - assertEquals("XQuery: " + query, 2, result.getSize()); - assertEquals("XQuery: " + query, Node.ELEMENT_NODE, ((XMLResource) result.getResource(0)).getContentAsDOM().getNodeType()); - assertEquals("XQuery: " + query, "a", ((XMLResource) result.getResource(0)).getContentAsDOM().getNodeName()); - assertEquals("XQuery: " + query, "1", result.getResource(1).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 2, result.getSize()); + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, Node.ELEMENT_NODE, resource.getContentAsDOM().getNodeType()); + assertEquals("XQuery: " + query, "a", resource.getContentAsDOM().getNodeName()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("XQuery: " + query, "1", resource.getContent()); + } + } + query = "let $v as node()* := ( , 1 )\n" + "return $v"; - try { - exceptionThrown = false; - result = service.query(query); - } catch (XMLDBException e) { + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure result is closed + } catch (final XMLDBException e) { exceptionThrown = true; message = e.getMessage(); } assertTrue(exceptionThrown); + query = "let $v as item()* := ( , 1 )\n" + "let $w as element()* := $v\n" + "return $w"; - try { - exceptionThrown = false; - result = service.query(query); - result = service.query(query); - } catch (XMLDBException e) { + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { exceptionThrown = true; message = e.getMessage(); } assertTrue(exceptionThrown); + query = "declare variable $v as element()* := ( , );\n" + "declare variable $w := { $v };\n" + "declare variable $x as element()* := $w/assign;\n" + "$x"; - result = service.query(query); - assertEquals("XQuery: " + query, 2, result.getSize()); - assertEquals("XQuery: " + query, Node.ELEMENT_NODE, ((XMLResource) result.getResource(0)).getContentAsDOM().getNodeType()); - assertEquals("XQuery: " + query, "assign", ((XMLResource) result.getResource(0)).getContentAsDOM().getNodeName()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 2, result.getSize()); + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, Node.ELEMENT_NODE, resource.getContentAsDOM().getNodeType()); + assertEquals("XQuery: " + query, "assign", resource.getContentAsDOM().getNodeName()); + } + } + query = "declare variable $v as node()* := ();\n" + "$v"; - result = service.query(query); - assertEquals("XQuery: " + query, 0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 0, result.getSize()); + } + query = "declare variable $v as item()* := ();\n" + "$v"; - result = service.query(query); - assertEquals("XQuery: " + query, 0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 0, result.getSize()); + } + query = "declare variable $v as empty-sequence() := ();\n" + "$v"; - result = service.query(query); - assertEquals("XQuery: " + query, 0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 0, result.getSize()); + } + query = "declare variable $v as item() := ();\n" + "$v"; - try { - exceptionThrown = false; - result = service.query(query); - } catch (XMLDBException e) { + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure result is closed + } catch (final XMLDBException e) { exceptionThrown = true; message = e.getMessage(); } assertTrue("XQuery: " + query, exceptionThrown); + query = "declare variable $v as item()* := ( , 1 );\n" + "$v"; - result = service.query(query); - assertEquals("XQuery: " + query, 2, result.getSize()); - assertEquals("XQuery: " + query, Node.ELEMENT_NODE, ((XMLResource) result.getResource(0)).getContentAsDOM().getNodeType()); - assertEquals("XQuery: " + query, "a", ((XMLResource) result.getResource(0)).getContentAsDOM().getNodeName()); - assertEquals("XQuery: " + query, "1", result.getResource(1).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 2, result.getSize()); + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, Node.ELEMENT_NODE, resource.getContentAsDOM().getNodeType()); + assertEquals("XQuery: " + query, "a", resource.getContentAsDOM().getNodeName()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("XQuery: " + query, "1", resource.getContent()); + } + } + query = "declare variable $v as node()* := ( , 1 );\n" + "$v"; - try { - exceptionThrown = false; - result = service.query(query); - } catch (XMLDBException e) { + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure result is closed + } catch (final XMLDBException e) { exceptionThrown = true; message = e.getMessage(); } assertTrue(exceptionThrown); + query = "declare variable $v as item()* := ( , 1 );\n" + "declare variable $w as element()* := $v;\n" + "$w"; - try { - exceptionThrown = false; - result = service.query(query); - } catch (XMLDBException e) { + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure result is closed + } catch (final XMLDBException e) { exceptionThrown = true; message = e.getMessage(); } assertTrue(exceptionThrown); + query = "let $v as document-node() := doc('" + XmldbURI.ROOT_COLLECTION + "/test/" + NUMBERS_XML + "') \n" + "return $v"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - //TODO : no way to test the node type ? - //assertEquals( "XQuery: " + query, Node.DOCUMENT_NODE, ((XMLResource)result.getResource(0))); - final Node n = ((XMLResource) result.getResource(0)).getContentAsDOM(); - assertTrue(n instanceof Document); - assertEquals("XQuery: " + query, "test", ((Document) n).getDocumentElement().getNodeName()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + //TODO : no way to test the node type ? + //assertEquals( "XQuery: " + query, Node.DOCUMENT_NODE, ((XMLResource)result.getResource(0))); + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + final Node n = resource.getContentAsDOM(); + assertTrue(n instanceof Document); + assertEquals("XQuery: " + query, "test", ((Document) n).getDocumentElement().getNodeName()); + } + } } @Test public void precedence() throws XMLDBException { - ResourceSet result; - String query; - @SuppressWarnings("unused") - boolean exceptionThrown; - @SuppressWarnings("unused") - String message; - - XPathQueryService service = - storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); - query = "xquery version \"1.0\";\n" + "declare namespace blah=\"blah\";\n" + "declare variable $blah:param := \"value-1\";\n" + "let $blah:param := \"value-2\"\n" + "(:: FLWOR expressions have a higher precedence than the comma operator ::)\n" + "return $blah:param, $blah:param "; - result = service.query(query); - assertEquals("XQuery: " + query, 2, result.getSize()); - assertEquals("XQuery: " + query, "value-2", result.getResource(0).getContent()); - assertEquals("XQuery: " + query, "value-1", result.getResource(1).getContent()); + final XPathQueryService service = storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); + final String query = "xquery version \"1.0\";\n" + "declare namespace blah=\"blah\";\n" + "declare variable $blah:param := \"value-1\";\n" + "let $blah:param := \"value-2\"\n" + "(:: FLWOR expressions have a higher precedence than the comma operator ::)\n" + "return $blah:param, $blah:param "; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "value-2", resource.getContent()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("XQuery: " + query, "value-1", resource.getContent()); + } + } } @Test public void improbableAxesAndNodeTestsCombinations() throws XMLDBException { - ResourceSet result; - String query; - boolean exceptionThrown; - @SuppressWarnings("unused") - String message; - - XPathQueryService service = - storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); - query = "let $a := ac/self::comment() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + final XPathQueryService service = storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); + String query = "let $a := ac/self::comment() return {$a}"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } + query = "let $a := ac/parent::comment() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } + query = "let $a := ac/ancestor::comment() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } + query = "let $a := ac/ancestor-or-self::comment() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } // This one is intercepted by the parser query = "let $a := ac/attribute::comment() return {$a}"; - try { - exceptionThrown = false; - result = service.query(query); - } catch (XMLDBException e) { + String message = ""; + boolean exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { exceptionThrown = true; message = e.getMessage(); } @@ -706,65 +796,109 @@ public void improbableAxesAndNodeTestsCombinations() throws XMLDBException { // This one is intercepted by the parser query = "let $a := ac/namespace::comment() return {$a}"; - try { - exceptionThrown = false; - result = service.query(query); - } catch (XMLDBException e) { + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure result is closed + } catch (final XMLDBException e) { exceptionThrown = true; message = e.getMessage(); } assertTrue(exceptionThrown); + query = "let $a := ac/self::attribute() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } + query = "let $a := ac/parent::attribute() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } + query = "let $a := ac/ancestor::attribute() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } + query = "let $a := ac/ancestor-or-self::attribute() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } + query = "let $a := ac/child::attribute() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } + query = "let $a := ac/descendant::attribute() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } + query = "let $a := ac/descendant-or-self::attribute() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } + query = "let $a := ac/preceding::attribute() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } + query = "let $a := ac/preceding-sibling::attribute() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } + query = "let $a := ac/following::attribute() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } + query = "let $a := ac/following-sibling::attribute() return {$a}"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } + } // This one is intercepted by the parser query = "let $a := ac/namespace::attribute() return {$a}"; - try { - exceptionThrown = false; - result = service.query(query); - } catch (XMLDBException e) { + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { exceptionThrown = true; message = e.getMessage(); } @@ -774,32 +908,36 @@ public void improbableAxesAndNodeTestsCombinations() throws XMLDBException { /* query = "let $a := ac/self::processing-instruction('foo') return {$a}"; - result = service.query(query); - assertEquals( "XQuery: " + query, 1, result.getSize() ); - assertEquals( "XQuery: " + query, "", ((XMLResource)result.getResource(0)).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals( "XQuery: " + query, 1, result.getSize() ); + assertEquals( "XQuery: " + query, "", ((XMLResource)result.getResource(0)).getContent()); + } query = "let $a := ac/parent::processing-instruction('foo') return {$a}"; - result = service.query(query); - assertEquals( "XQuery: " + query, 1, result.getSize() ); - assertEquals( "XQuery: " + query, "", ((XMLResource)result.getResource(0)).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals( "XQuery: " + query, 1, result.getSize() ); + assertEquals( "XQuery: " + query, "", ((XMLResource)result.getResource(0)).getContent()); + } query = "let $a := ac/ancestor::processing-instruction('foo') return {$a}"; - result = service.query(query); - assertEquals( "XQuery: " + query, 1, result.getSize() ); - assertEquals( "XQuery: " + query, "", ((XMLResource)result.getResource(0)).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals( "XQuery: " + query, 1, result.getSize() ); + assertEquals( "XQuery: " + query, "", ((XMLResource)result.getResource(0)).getContent()); + } query = "let $a := ac/ancestor-or-self::processing-instruction('foo') return {$a}"; - result = service.query(query); - assertEquals( "XQuery: " + query, 1, result.getSize() ); - assertEquals( "XQuery: " + query, "", ((XMLResource)result.getResource(0)).getContent()); - */ + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals( "XQuery: " + query, 1, result.getSize() ); + assertEquals( "XQuery: " + query, "", ((XMLResource)result.getResource(0)).getContent()); + } + */ // This one is intercepted by the parser query = "let $a := ac/attribute::processing-instruction('foo') return {$a}"; - try { - exceptionThrown = false; - result = service.query(query); - } catch (XMLDBException e) { + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { exceptionThrown = true; message = e.getMessage(); } @@ -807,10 +945,10 @@ public void improbableAxesAndNodeTestsCombinations() throws XMLDBException { // This one is intercepted by the parser query = "let $a := ac/namespace::processing-instruction('foo') return {$a}"; - try { - exceptionThrown = false; - result = service.query(query); - } catch (XMLDBException e) { + exceptionThrown = false; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { exceptionThrown = true; message = e.getMessage(); } @@ -819,110 +957,124 @@ public void improbableAxesAndNodeTestsCombinations() throws XMLDBException { @Test public void namespace() throws XMLDBException, IOException, SAXException { - Resource doc; - ResourceSet result; - String query; - @SuppressWarnings("unused") - XMLResource resu; - @SuppressWarnings("unused") - boolean exceptionThrown; - String message; - - Collection testCollection = getTestCollection(); - doc = testCollection.createResource(MODULE1_NAME, BinaryResource.class); - doc.setContent(module1); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); - - doc = testCollection.createResource(MODULE2_NAME, BinaryResource.class); - doc.setContent(module2); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); - - doc = testCollection.createResource(NAMESPACED_NAME, XMLResource.class); - doc.setContent(namespacedDocument); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XML); - testCollection.storeResource(doc); - - XPathQueryService service = - testCollection.getService(XPathQueryService.class); - query = "xquery version \"1.0\";\n" + "import module namespace blah=\"blah\" at \"" + URI + "/test/" + MODULE1_NAME + "\";\n" + "(:: redefine existing prefix ::)\n" + "declare namespace blah=\"bla\";\n" + "$blah:param"; - try { - message = ""; - result = service.query(query); - } catch (XMLDBException e) { + final XPathQueryService service; + try (final Collection testCollection = getTestCollection()) { + try (final Resource doc = testCollection.createResource(MODULE1_NAME, BinaryResource.class)) { + doc.setContent(module1); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + } + + try (final Resource doc = testCollection.createResource(MODULE2_NAME, BinaryResource.class)) { + doc.setContent(module2); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + } + + try (final Resource doc = testCollection.createResource(NAMESPACED_NAME, XMLResource.class)) { + doc.setContent(namespacedDocument); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XML); + testCollection.storeResource(doc); + } + + service = testCollection.getService(XPathQueryService.class); + } + + String query = "xquery version \"1.0\";\n" + "import module namespace blah=\"blah\" at \"" + URI + "/test/" + MODULE1_NAME + "\";\n" + "(:: redefine existing prefix ::)\n" + "declare namespace blah=\"bla\";\n" + "$blah:param"; + String message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { message = e.getMessage(); } assertTrue(message.indexOf("XQST0033") > -1); + query = "xquery version \"1.0\";\n" + "import module namespace blah=\"blah\" at \"" + URI + "/test/" + MODULE1_NAME + "\";\n" + "(:: redefine existing prefix with same getUri ::)\n" + "declare namespace blah=\"blah\";\n" + "declare variable $blah:param := \"value-2\";\n" + "$blah:param"; - try { - message = ""; - result = service.query(query); - } catch (XMLDBException e) { + message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { message = e.getMessage(); } assertTrue(message.indexOf("XQST0033") > -1); + query = "xquery version \"1.0\";\n" + "import module namespace foo=\"ho\" at \"" + URI + "/test/" + MODULE1_NAME + "\";\n" + "$foo:bar"; - try { - message = ""; - result = service.query(query); - } catch (XMLDBException e) { + message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { message = e.getMessage(); } assertTrue(message.indexOf("does not match namespace URI") > -1); + query = "xquery version \"1.0\";\n" + "import module namespace foo=\"ho\" at \"" + URI + "/test/" + MODULE2_NAME + "\";\n" + "$bar"; - try { - message = ""; - result = service.query(query); - } catch (XMLDBException e) { + message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { message = e.getMessage(); } assertTrue(message.indexOf("No namespace defined for prefix") > -1); + query = "xquery version \"1.0\";\n" + "import module namespace foo=\"blah\" at \"" + URI + "/test/" + MODULE2_NAME + "\";\n" + "$bar"; - try { - message = ""; - result = service.query(query); - } catch (XMLDBException e) { + message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { message = e.getMessage(); } assertTrue(message.indexOf("No namespace defined for prefix") > -1); + query = "declare namespace x = \"http://www.foo.com\"; \n" + "let $a := doc('" + XmldbURI.ROOT_COLLECTION + "/test/" + NAMESPACED_NAME + "') \n" + "return $a//x:edition"; - result = service.query(query); - assertEquals("XQuery: " + query, 0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 0, result.getSize()); + } + query = "declare namespace x = \"http://www.foo.com\"; \n" + "declare namespace y = \"http://exist.sourceforge.net/dc-ext\"; \n" + "let $a := doc('" + XmldbURI.ROOT_COLLECTION + "/test/" + NAMESPACED_NAME + "') \n" + "return $a//y:edition"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "place", - result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "place", + resource.getContent()); + } + } + query = "{//rdf:Description}"; - result = service.query(query); - assertEquals(query, - "\n" + - " \n" + - " title\n" + - " creator\n" + - " place\n" + - " place\n" + - " \n" + - "", - result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertEquals(query, + "\n" + + " \n" + + " title\n" + + " creator\n" + + " place\n" + + " place\n" + + " \n" + + "", + resource.getContent()); + } + } + query = "{//Description}"; - result = service.query(query); - assertEquals("XQuery: " + query, - "\n" + - " \n" + - " title\n" + - " creator\n" + - " place\n" + - " place\n" + - " \n" + - "", - result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, + "\n" + + " \n" + + " title\n" + + " creator\n" + + " place\n" + + " place\n" + + " \n" + + "", + resource.getContent()); + } + } //Interesting one : let's see with XQuery gurus :-) //declare namespace fn=""; @@ -936,93 +1088,105 @@ public void namespace() throws XMLDBException, IOException, SAXException { query = "declare option exist:serialize 'indent=no';" + "for $x in " + "return {$x//*:child4}"; - result = service.query(query); - - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("")); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } } @Test public void namespaceWithTransform() throws XMLDBException { - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + + String query = + "xquery version \"1.0\";\n" + + "declare namespace transform=\"http://exist-db.org/xquery/transform\";\n" + + "declare variable $xml := \n" + + " text\n" + + ";\n" + + "declare variable $xslt := \n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + ";\n" + + "\n" + + " \n" + + " {transform:transform($xml, $xslt, ())}\n" + + " \n" + + ""; + + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + + //check there is one result + assertEquals(1, result.getSize()); + + try (final Resource resource = result.getResource(0)) { + String content = (String) resource.getContent(); + + //check the namespace + assertTrue(content.startsWith("")); + + //check the content + assertTrue(content.indexOf("
text
") > -1); + } + } + } + } - String query = - "xquery version \"1.0\";\n" + - "declare namespace transform=\"http://exist-db.org/xquery/transform\";\n" + - "declare variable $xml := \n" + - " text\n" + - ";\n" + - "declare variable $xslt := \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - ";\n" + - "\n" + - " \n" + - " {transform:transform($xml, $xslt, ())}\n" + - " \n" + - ""; + @Test + public void module() throws XMLDBException { + final XPathQueryService service; + try (final Collection testCollection = getTestCollection()) { + try (final Resource doc = testCollection.createResource(MODULE1_NAME, BinaryResource.class)) { + doc.setContent(module1); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + } - ResourceSet result = service.query(query); + try (final Resource doc = testCollection.createResource(MODULE3_NAME, BinaryResource.class)) { + doc.setContent(module3); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + } - //check there is one result - assertEquals(1, result.getSize()); + try (final Resource doc = testCollection.createResource(MODULE4_NAME, BinaryResource.class)) { + doc.setContent(module4); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + } - String content = (String) result.getResource(0).getContent(); + try (final Resource doc = testCollection.createResource(FATHER_MODULE_NAME, BinaryResource.class)) { + doc.setContent(fatherModule); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + } - //check the namespace - assertTrue(content.startsWith("")); + try (final Resource doc = testCollection.createResource(CHILD1_MODULE_NAME, BinaryResource.class)) { + doc.setContent(child1Module); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + } - //check the content - assertTrue(content.indexOf("
text
") > -1); - } + try (final Resource doc = testCollection.createResource(CHILD2_MODULE_NAME, BinaryResource.class)) { + doc.setContent(child2Module); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + } - @Test - public void module() throws XMLDBException { - Resource doc; - ResourceSet result; - String query; - String message; - - Collection testCollection = getTestCollection(); - doc = testCollection.createResource(MODULE1_NAME, BinaryResource.class); - doc.setContent(module1); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); - - doc = testCollection.createResource(MODULE3_NAME, BinaryResource.class); - doc.setContent(module3); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); - - doc = testCollection.createResource(MODULE4_NAME, BinaryResource.class); - doc.setContent(module4); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); - - doc = testCollection.createResource(FATHER_MODULE_NAME, BinaryResource.class); - doc.setContent(fatherModule); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); - - doc = testCollection.createResource(CHILD1_MODULE_NAME, BinaryResource.class); - doc.setContent(child1Module); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); - - doc = testCollection.createResource(CHILD2_MODULE_NAME, BinaryResource.class); - doc.setContent(child2Module); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); - - XPathQueryService service = - testCollection.getService( - XPathQueryService.class); - query = "xquery version \"1.0\";\n" + "import module namespace blah=\"blah\" at \"" + URI + "/test/" + MODULE1_NAME + "\";\n" + "$blah:param"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "value-1", result.getResource(0).getContent()); + service = testCollection.getService(XPathQueryService.class); + } + + String query = "xquery version \"1.0\";\n" + "import module namespace blah=\"blah\" at \"" + URI + "/test/" + MODULE1_NAME + "\";\n" + "$blah:param"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "value-1", resource.getContent()); + } + } // query = "xquery version \"1.0\";\n" + "import module namespace blah=\"blah\" at \"" + getUri + "/test/" + MODULE1_NAME + "\";\n" + "(:: redefine variable ::)\n" + "declare variable $blah:param := \"value-2\";\n" + "$blah:param"; // try { @@ -1033,69 +1197,81 @@ public void module() throws XMLDBException { // } // assertTrue(message.indexOf("XQST0049") > -1); query = "xquery version \"1.0\";\n" + "import module namespace blah=\"blah\" at \"" + URI + "/test/" + MODULE1_NAME + "\";\n" + "declare namespace blah2=\"blah\";\n" + "$blah2:param"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "value-1", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "value-1", resource.getContent()); + } + } + query = "xquery version \"1.0\";\n" + "import module namespace blah=\"bla\" at \"" + URI + "/test/" + MODULE1_NAME + "\";\n" + "$blah:param"; - try { - message = ""; - result = service.query(query); - } catch (XMLDBException e) { + String message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { message = e.getMessage(); } assertTrue(message.indexOf("does not match namespace URI") > -1); query = "xquery version \"1.0\";\n" + "import module namespace foo=\"foo\" at \"" + URI + "/test/" + FATHER_MODULE_NAME + "\";\n" + "$foo:bar, $foo:bar1, $foo:bar2"; - result = service.query(query); - assertEquals("XQuery: " + query, 3, result.getSize()); - assertEquals("XQuery: " + query, "bar", result.getResource(0).getContent()); - assertEquals("XQuery: " + query, "bar1", result.getResource(1).getContent()); - assertEquals("XQuery: " + query, "bar2", result.getResource(2).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 3, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "bar", resource.getContent()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("XQuery: " + query, "bar1", resource.getContent()); + } + try (final Resource resource = result.getResource(2)) { + assertEquals("XQuery: " + query, "bar2", resource.getContent()); + } + } // Non-transitive inheritance check query = "xquery version \"1.0\";\n" + "import module namespace foo=\"foo\" at \"" + URI + "/test/" + FATHER_MODULE_NAME + "\";\n" + "declare namespace foo1=\"foo1\"; \n" + "$foo1:bar"; - try { - message = ""; - result = service.query(query); - } catch (XMLDBException e) { + message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { message = e.getMessage(); } assertTrue(message.indexOf("XPST0008") > -1); // Non-transitive inheritance check query = "xquery version \"1.0\";\n" + "import module namespace foo=\"foo\" at \"" + URI + "/test/" + FATHER_MODULE_NAME + "\";\n" + "declare namespace foo2=\"foo2\"; \n" + "$foo2:bar"; - try { - message = ""; - result = service.query(query); - } catch (XMLDBException e) { + message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { message = e.getMessage(); } assertTrue(message.indexOf("XPST0008") > -1); + query = "xquery version \"1.0\";\n" + "import module namespace foo1=\"foo\" at \"" + URI + "/test/" + CHILD1_MODULE_NAME + "\";\n" + "import module namespace foo2=\"foo\" at \"" + URI + "/test/" + CHILD1_MODULE_NAME + "\";\n" + "$foo1:bar"; - try { - message = ""; - result = service.query(query); - } catch (XMLDBException e) { + message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { message = e.getMessage(); } // Should be a XQST0047 error assertTrue(message.indexOf("does not match namespace URI") > -1); query = "xquery version \"1.0\";\n" + "import module namespace foo=\"foo\" at \"" + URI + "/test/" + MODULE3_NAME + "\";\n" + "$bar:bar"; - try { - message = ""; - result = service.query(query); - } catch (XMLDBException e) { + message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { message = e.getMessage(); } assertTrue(message.indexOf("No namespace defined for prefix") > -1); + query = "xquery version \"1.0\";\n" + "import module namespace foo=\"foo\" at \"" + URI + "/test/" + MODULE4_NAME + "\";\n" + "foo:bar()"; - try { - message = ""; - result = service.query(query); + message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { //WARNING ! //This result is false ! The external vairable has not been resolved //Furthermore it is not in the module's namespace ! assertEquals("XQuery: " + query, 0, result.getSize()); - } catch (XMLDBException e) { + } catch (final XMLDBException e) { message = e.getMessage(); } //This is the good result ! @@ -1104,33 +1280,41 @@ public void module() throws XMLDBException { @Test public void modulesAndNS() throws XMLDBException, IOException, SAXException { - Collection testCollection = getTestCollection(); - Resource doc = testCollection.createResource(MODULE7_NAME, BinaryResource.class); - doc.setContent(module7); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); + final XPathQueryService service; + try (final Collection testCollection = getTestCollection()) { + + try (final Resource doc = testCollection.createResource(MODULE7_NAME, BinaryResource.class)) { + doc.setContent(module7); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + } - XPathQueryService service = testCollection.getService(XPathQueryService.class); + service = testCollection.getService(XPathQueryService.class); + } service.setProperty(OutputKeys.INDENT, "no"); String query = "xquery version \"1.0\";\n" + "import module namespace foo=\"foo\" at \"" + URI + "/test/" + MODULE7_NAME + "\";\n" + "
" + "{ foo:link() }" + "
"; - ResourceSet result = service.query(query); - assertEquals(1, result.getSize()); - result.getResource(0).getContent(); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("
")); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } query = "xquery version \"1.0\";\n" + "import module namespace foo=\"foo\" at \"" + URI + "/test/" + MODULE7_NAME + "\";\n" + "
" + "{ foo:copy(Link) }" + "
"; - result = service.query(query); - assertEquals(1, result.getSize()); - result.getResource(0).getContent(); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("")); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("")); + } + } } @Test @@ -1168,39 +1352,49 @@ public void importExternalClasspathMainModule() throws EXistException, IOExcepti @Test public void importExternalClasspathLibraryModule() throws XMLDBException { final long timestamp = System.currentTimeMillis(); - final Collection testCollection = getTestCollection(); - final Resource doc = testCollection.createResource("import-external-classpath.xq", BinaryResource.class); - doc.setContent( - "import module namespace ext1 = \"http://import-external-classpath-library-module-test.com\" at \"resource:org/exist/xquery/external-classpath-library-module.xqm\";\n" - + "ext1:echo(" + timestamp + ")" - ); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); + final EXistXPathQueryService service; + try (final Collection testCollection = getTestCollection()) { + + try(final Resource doc = testCollection.createResource("import-external-classpath.xq", BinaryResource.class)) { + doc.setContent( + "import module namespace ext1 = \"http://import-external-classpath-library-module-test.com\" at \"resource:org/exist/xquery/external-classpath-library-module.xqm\";\n" + + "ext1:echo(" + timestamp + ")" + ); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + } - final EXistXPathQueryService service = (EXistXPathQueryService) testCollection.getService(XPathQueryService.class); - final ResourceSet resourceSet = service.executeStoredQuery("/db/test/import-external-classpath.xq"); + service = (EXistXPathQueryService) testCollection.getService(XPathQueryService.class); + } + try (final EXistResourceSet result = service.executeStoredQuery("/db/test/import-external-classpath.xq")) { - assertEquals(1, resourceSet.getSize()); + assertEquals(1, result.getSize()); - final Resource resource = resourceSet.getResource(0); - final Source expected = Input.fromString("" + timestamp + "").build(); - final Source actual = Input.fromString(resource.getContent().toString()).build(); - final Diff diff = DiffBuilder.compare(expected) - .withTest(actual) - .checkForIdentical() - .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + try (final Resource resource = result.getResource(0)) { + final Source expected = Input.fromString("" + timestamp + "").build(); + final Source actual = Input.fromString(resource.getContent().toString()).build(); + final Diff diff = DiffBuilder.compare(expected) + .withTest(actual) + .checkForIdentical() + .build(); + assertFalse(diff.toString(), diff.hasDifferences()); + } + } } @Test public void doubleDocNode_2078755() throws XMLDBException { - Collection testCollection = getTestCollection(); - Resource doc = testCollection.createResource(MODULE8_NAME, BinaryResource.class); - doc.setContent(module8); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); + final XPathQueryService service; + try (final Collection testCollection = getTestCollection()) { + + try (final Resource doc = testCollection.createResource(MODULE8_NAME, BinaryResource.class)) { + doc.setContent(module8); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + } - XPathQueryService service = testCollection.getService(XPathQueryService.class); + service = testCollection.getService(XPathQueryService.class); + } service.setProperty(OutputKeys.INDENT, "no"); String query = "import module namespace dr = \"double-root2\" at \"" + URI + "/test/" + MODULE8_NAME + "\";\n" +"let $doc1 := dr:documentIn() \n" @@ -1209,47 +1403,66 @@ public void doubleDocNode_2078755() throws XMLDBException { +"let $count2 := count($doc2/element()) \n" +"return ($count1, $count2) \n"; - ResourceSet result = service.query(query); - assertEquals(2, result.getSize()); - assertEquals("1", result.getResource(0).getContent().toString()); - assertEquals("1", result.getResource(1).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("1", resource.getContent().toString()); + } + } } @Test public void globalVars() throws XMLDBException { - Collection testCollection = getTestCollection(); - Resource doc = testCollection.createResource(MODULE5_NAME, BinaryResource.class); - doc.setContent(module5); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); - - doc = testCollection.createResource(MODULE6_NAME, BinaryResource.class); - doc.setContent(module6); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); - XQueryService service = (XQueryService) testCollection.getService(XPathQueryService.class); + final XQueryService service; + try (final Collection testCollection = getTestCollection()) { + + try (final Resource doc = testCollection.createResource(MODULE5_NAME, BinaryResource.class)) { + doc.setContent(module5); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + } + + try (final Resource doc = testCollection.createResource(MODULE6_NAME, BinaryResource.class)) { + doc.setContent(module6); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + service = (XQueryService) testCollection.getService(XPathQueryService.class); + } + } String query = "xquery version \"1.0\";\n" + "import module namespace foo=\"foo\" at \"" + URI + "/test/" + MODULE5_NAME + "\";\n" + "$foo:bar"; - ResourceSet result = service.query(query); - assertEquals(result.getSize(), 1); - assertEquals(result.getResource(0).getContent(), "bar"); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(result.getSize(), 1); + try (final Resource resource = result.getResource(0)) { + assertEquals(resource.getContent(), "bar"); + } + } + query = "xquery version \"1.0\";\n" + "declare variable $local:a := 'abc';" + "$local:a"; - result = service.query(query); - assertEquals(result.getSize(), 1); - assertEquals(result.getResource(0).getContent(), "abc"); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(result.getSize(), 1); + try (final Resource resource = result.getResource(0)) { + assertEquals(resource.getContent(), "abc"); + } + } + boolean gotException = false; - try { - query = "xquery version \"1.0\";\n" + "import module namespace foo=\"foo\" at \"" + URI + "/test/" + MODULE6_NAME + "\";\n" + "$foo:bar"; - result = service.query(query); - } catch (XMLDBException e) { + query = "xquery version \"1.0\";\n" + "import module namespace foo=\"foo\" at \"" + URI + "/test/" + MODULE6_NAME + "\";\n" + "$foo:bar"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { assertTrue("Test should generate err:XQST0049, got: " + e.getMessage(), e.getMessage().indexOf("err:XQST0049") > -1); gotException = true; } assertTrue("Duplicate global variable should generate error", gotException); + gotException = false; - try { - query = "xquery version \"1.0\";\n" + "declare variable $local:a := 'abc';" + "declare variable $local:a := 'abc';" + "$local:a"; - result = service.query(query); - } catch (XMLDBException e) { + query = "xquery version \"1.0\";\n" + "declare variable $local:a := 'abc';" + "declare variable $local:a := 'abc';" + "$local:a"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { assertTrue("Test should generate err:XQST0049, got: " + e.getMessage(), e.getMessage().indexOf("err:XQST0049") > -1); gotException = true; } @@ -1258,57 +1471,67 @@ public void globalVars() throws XMLDBException { @Test public void functionDoc() throws XMLDBException, IOException, SAXException { - ResourceSet result; - String query; - @SuppressWarnings("unused") - boolean exceptionThrown; - @SuppressWarnings("unused") - String message; - - XPathQueryService service = - storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); - query = "doc('" + XmldbURI.ROOT_COLLECTION + "/test/" + NUMBERS_XML + "')"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - - final Node n = ((XMLResource) result.getResource(0)).getContentAsDOM(); - assertTrue(n instanceof Document); - final Source expected = Input.fromString(numbers).build(); - final Source actual = Input.fromNode(n).build(); - - final Diff diff = DiffBuilder.compare(expected).withTest(actual) - .checkForSimilar() - .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + final XPathQueryService service = storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); + String query = "doc('" + XmldbURI.ROOT_COLLECTION + "/test/" + NUMBERS_XML + "')"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + + try (final Resource resource = result.getResource(0)) { + final Node n = ((XMLResource) resource).getContentAsDOM(); + assertTrue(n instanceof Document); + final Source expected = Input.fromString(numbers).build(); + final Source actual = Input.fromNode(n).build(); + + final Diff diff = DiffBuilder.compare(expected).withTest(actual) + .checkForSimilar() + .build(); + assertFalse(diff.toString(), diff.hasDifferences()); + } + } //ignore eXist namespace's attributes //assertEquals(1, d.getAllDifferences().size()); query = "let $v := ()\n" + "return doc($v)"; - result = service.query(query); - assertEquals("XQuery: " + query, 0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 0, result.getSize()); + } + query = "doc('" + XmldbURI.ROOT_COLLECTION + "/test/dummy" + NUMBERS_XML + "')"; - try { - exceptionThrown = false; - result = service.query(query); - } catch (XMLDBException e) { + boolean exceptionThrown = false; + String message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + //TODO : to be decided ! + //assertTrue(exceptionThrown); + assertEquals(0, result.getSize()); + } catch (final XMLDBException e) { exceptionThrown = true; message = e.getMessage(); } - //TODO : to be decided ! - //assertTrue(exceptionThrown); - assertEquals(0, result.getSize()); + query = "doc-available('" + XmldbURI.ROOT_COLLECTION + "/test/" + NUMBERS_XML + "')"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "true", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "true", resource.getContent()); + } + } + query = "let $v := ()\n" + "return doc-available($v)"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "false", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "false", resource.getContent()); + } + } + query = "doc-available('" + XmldbURI.ROOT_COLLECTION + "/test/dummy" + NUMBERS_XML + "')"; - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "false", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "false", resource.getContent()); + } + } } /** @@ -1325,40 +1548,61 @@ public void functionDocExternal() throws XMLDBException { if (con instanceof HttpURLConnection httpConnection) { hasInternetAccess = (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK); } - } catch(MalformedURLException e) { + } catch (MalformedURLException e) { fail(e.getMessage()); } catch (IOException e) { //Ignore } assumeTrue("No Internet access: skipping 'functionDocExternal' tests", hasInternetAccess); - XPathQueryService service = - storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); + final XPathQueryService service = storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); String query = "if (doc-available(\"http://www.w3.org/XML/Core/\")) then doc(\"http://www.w3.org/XML/Core/\") else ()"; - ResourceSet result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + } + query = "if (doc-available(\"http://www.w3.org/XML/dummy\")) then doc(\"http://www.w3.org/XML/dummy\") else ()"; - result = service.query(query); - assertEquals("XQuery: " + query, 0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 0, result.getSize()); + } + query = "doc-available(\"http://www.w3.org/XML/Core/\")"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "true", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "true", resource.getContent()); + } + } + query = "doc-available(\"http://www.google.com/404\")"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "false", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "false", resource.getContent()); + } + } + //A redirected 404 query = "doc-available(\"http://java.sun.com/404\")"; - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "false", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "false", resource.getContent()); + } + } + query = "if (doc-available(\"file:////doesnotexist.xml\")) then doc(\"file:////doesnotexist.xml\") else ()"; - result = service.query(query); - assertEquals("XQuery: " + query, 0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 0, result.getSize()); + } + query = "doc-available(\"file:////doesnotexist.xml\")"; - result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, "false", result.getResource(0).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "false", resource.getContent()); + } + } } private String makeString(final int n) { @@ -1371,153 +1615,170 @@ private String makeString(final int n) { public void textConstructor() throws XMLDBException { String query = "text{ \"a\" }, text{ \"b\" }, text{ \"c\" }, text{ \"d\" }"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals("XQuery: " + query, 4, result.getSize()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 4, result.getSize()); - assertEquals("XQuery: " + query, "a", result.getResource(0).getContent().toString()); - assertEquals("XQuery: " + query, "b", result.getResource(1).getContent().toString()); - assertEquals("XQuery: " + query, "c", result.getResource(2).getContent().toString()); - assertEquals("XQuery: " + query, "d", result.getResource(3).getContent().toString()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "a", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("XQuery: " + query, "b", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(2)) { + assertEquals("XQuery: " + query, "c", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(3)) { + assertEquals("XQuery: " + query, "d", resource.getContent().toString()); + } + } + } } @Test public void userEscalationForInMemoryNodes() throws XMLDBException { String query = "xmldb:login(\"xmldb:exist:///db\", \"guest\", \"guest\"), sm:id()/sm:id/sm:effective/sm:username/text(), let $node := value, $null := $node[@id eq '1'] return sm:id()/sm:id/sm:effective/sm:username/text()"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - Resource loggedIn = result.getResource(0); - Resource currentUser = result.getResource(1); - Resource currentUserAfterInMemoryOp = result.getResource(2); - - //check the login as guest worked - assertEquals("Logged in as quest: " + loggedIn.getContent().toString(), "true", loggedIn.getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource loggedIn = result.getResource(0)) { + //check the login as guest worked + assertEquals("Logged in as quest: " + loggedIn.getContent().toString(), "true", loggedIn.getContent().toString()); + } - //check that we are guest - assertEquals("After Login as guest, User should be guest and is: " + currentUser.getContent().toString(), "guest", currentUser.getContent().toString()); + try (final Resource currentUser = result.getResource(1)) { + //check that we are guest + assertEquals("After Login as guest, User should be guest and is: " + currentUser.getContent().toString(), "guest", currentUser.getContent().toString()); + } - //check that we are still guest - assertEquals("After Query, User should still be guest and is: " + currentUserAfterInMemoryOp.getContent().toString(), "guest", currentUserAfterInMemoryOp.getContent().toString()); + try (final Resource currentUserAfterInMemoryOp = result.getResource(2)) { + //check that we are still guest + assertEquals("After Query, User should still be guest and is: " + currentUserAfterInMemoryOp.getContent().toString(), "guest", currentUserAfterInMemoryOp.getContent().toString()); + } + } + } } @Test public void constructedAttributeValue() throws XMLDBException { String query = "let $attr := attribute d { \"xxx\" } " + "return string($attr)"; - XPathQueryService service = getTestCollection().getService( - XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals(1, result.getSize()); - assertEquals("xxx", result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("xxx", resource.getContent().toString()); + } + } + } } @Test public void attributeAxis() throws XMLDBException { - ResourceSet result; - String query; - XMLResource resu; - - @SuppressWarnings("unused") - String large = createXMLContentWithLargeString(); - XPathQueryService service = - storeXMLStringAndGetQueryService(file_name, xml); + createXMLContentWithLargeString(); + final XPathQueryService service = storeXMLStringAndGetQueryService(file_name, xml); - query = "let $node := (b)/descendant-or-self::*/attribute::id " + + String query = "let $node := (b)/descendant-or-self::*/attribute::id " + "return {$node}"; - result = service.query(query); - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, "OK", ((Element) resu.getContentAsDOM()).getAttribute("id")); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, "OK", ((Element) resource.getContentAsDOM()).getAttribute("id")); + } } @Test public void instanceOfDocumentNode() throws XMLDBException { - XPathQueryService service = - storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); + final XPathQueryService service = storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); String query = "let $doc := document { } " + "return $doc/root() instance of document-node()"; - ResourceSet result = service.query(query); - assertEquals("XQuery: " + query, "true", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "true", resource.getContent().toString()); + } + } } @Test public void instanceOfNamespaceNode() throws XMLDBException { - ResourceSet result = existEmbeddedServer.executeQuery("namespace test { 'test' } instance of namespace-node()"); - assertEquals(1,result.getSize()); - assertEquals("true", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("namespace test { 'test' } instance of namespace-node()")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("true", resource.getContent().toString()); + } + } - result = existEmbeddedServer.executeQuery(" instance of namespace-node()"); - assertEquals(1, result.getSize()); - assertEquals("false", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(" instance of namespace-node()")) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("false", resource.getContent().toString()); + } + } } @Test public void largeAttributeSimple() throws XMLDBException { - ResourceSet result; - String query; - @SuppressWarnings("unused") - XMLResource resu; - - String large = createXMLContentWithLargeString(); - XPathQueryService service = - storeXMLStringAndGetQueryService(file_name, xml); - - query = "doc('" + file_name + "') / details/metadata[@docid= '" + large + "' ]"; - result = service.queryResource(file_name, query); - assertEquals("XQuery: " + query, nbElem, result.getSize()); + final String large = createXMLContentWithLargeString(); + final XPathQueryService service = storeXMLStringAndGetQueryService(file_name, xml); + final String query = "doc('" + file_name + "') / details/metadata[@docid= '" + large + "' ]"; + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(file_name, query)) { + assertEquals("XQuery: " + query, nbElem, result.getSize()); + } } @Test public void cdataSerialization() throws XMLDBException { - ResourceSet result; - String query; - XMLResource resu; - - XPathQueryService service = getTestCollection().getService( - XPathQueryService.class); - - query = "let $doc := document{ } " + - "return $doc/root/string()"; - result = service.query(query); - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, "gaga", resu.getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + final String query = "let $doc := document{ } return $doc/root/string()"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, "gaga", resource.getContent().toString()); + } + } } @Test public void cdataQuery() throws XMLDBException { - ResourceSet result; - String query; - XMLResource resu; final String xml = ""; - XPathQueryService service = - storeXMLStringAndGetQueryService("cdata.xml", xml); + final XPathQueryService service = storeXMLStringAndGetQueryService("cdata.xml", xml); service.setProperty(OutputKeys.INDENT, "no"); - query = "//text()"; - result = service.queryResource("cdata.xml", query); - assertEquals(1, result.getSize()); - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, "world", resu.getContent().toString()); + + String query = "//text()"; + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("cdata.xml", query)) { + assertEquals(1, result.getSize()); + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, "world", resource.getContent().toString()); + } + } query = "//node/text()"; - result = service.queryResource("cdata.xml", query); - assertEquals(1, result.getSize()); - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, "world", resu.getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("cdata.xml", query)) { + assertEquals(1, result.getSize()); + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, "world", resource.getContent().toString()); + } + } query = "//node/node()"; - result = service.queryResource("cdata.xml", query); - assertEquals(1, result.getSize()); - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, "world", resu.getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("cdata.xml", query)) { + assertEquals(1, result.getSize()); + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, "world", resource.getContent().toString()); + } + } query = "/root[node = 'world']"; - result = service.queryResource("cdata.xml", query); - assertEquals(1, result.getSize()); - - // NOTE - no cdata-section-elements specified for XDM serialization - resu = (XMLResource) result.getResource(0); - assertEquals("XQuery: " + query, "world", resu.getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource("cdata.xml", query)) { + assertEquals(1, result.getSize()); + // NOTE - no cdata-section-elements specified for XDM serialization + try (final XMLResource resource = (XMLResource) result.getResource(0)) { + assertEquals("XQuery: " + query, "world", resource.getContent().toString()); + } + } } /** @@ -1525,99 +1786,90 @@ public void cdataQuery() throws XMLDBException { */ @Test public void attributeForNoResult() throws XMLDBException { - String query = "let $a := -1-2 " + // + final String query = "let $a := -1-2 " + // "return /a[./c]/@id/string()"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals(0, result.getSize()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(0, result.getSize()); + } + } } @Test public void largeAttributeContains() throws XMLDBException { - ResourceSet result; - String query; - @SuppressWarnings("unused") - XMLResource resu; - - @SuppressWarnings("unused") - String large = createXMLContentWithLargeString(); - XPathQueryService service = - storeXMLStringAndGetQueryService(file_name, xml); + createXMLContentWithLargeString(); + final XPathQueryService service = storeXMLStringAndGetQueryService(file_name, xml); - query = "doc('" + file_name + "') / details/metadata[ contains(@docid, 'aa') ]"; - result = service.queryResource(file_name, query); - assertEquals("XQuery: " + query, nbElem, result.getSize()); + final String query = "doc('" + file_name + "') / details/metadata[ contains(@docid, 'aa') ]"; + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(file_name, query)) { + assertEquals("XQuery: " + query, nbElem, result.getSize()); + } } @Test public void largeAttributeKeywordOperator() throws XMLDBException { - ResourceSet result; - String query; - @SuppressWarnings("unused") - XMLResource resu; - - String large = createXMLContentWithLargeString(); - XPathQueryService service = - storeXMLStringAndGetQueryService(file_name, xml); + final String large = createXMLContentWithLargeString(); + final XPathQueryService service = storeXMLStringAndGetQueryService(file_name, xml); - query = "doc('" + file_name + "') / details/metadata[ @docid = '" + large + "' ]"; - result = service.queryResource(file_name, query); - assertEquals("XQuery: " + query, nbElem, result.getSize()); + final String query = "doc('" + file_name + "') / details/metadata[ @docid = '" + large + "' ]"; + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(file_name, query)) { + assertEquals("XQuery: " + query, nbElem, result.getSize()); + } } @Test public void attributeNamespace() throws XMLDBException { - - String query = "declare function local:copy($nodes as node()*) as node()* {" + "for $n in $nodes return " + "if ($n instance of element()) then " + " element {node-name($n)} {(local:copy($n/@*), local:copy($n/node()))} " + "else if ($n instance of attribute()) then " + " attribute {node-name($n)} {$n} " + "else if ($n instance of text()) then " + " text {$n} " + "else " + " " + "};" + "let $c :=" + "" + "ccc" + "" + "return local:copy($c)"; - - XPathQueryService service = getTestCollection().getService( - XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals(1, result.getSize()); - assertEquals("" + "ccc" + "", result.getResource(0).getContent().toString()); + final String query = "declare function local:copy($nodes as node()*) as node()* {" + "for $n in $nodes return " + "if ($n instance of element()) then " + " element {node-name($n)} {(local:copy($n/@*), local:copy($n/node()))} " + "else if ($n instance of attribute()) then " + " attribute {node-name($n)} {$n} " + "else if ($n instance of text()) then " + " text {$n} " + "else " + " " + "};" + "let $c :=" + "" + "ccc" + "" + "return local:copy($c)"; + + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("" + "ccc" + "", resource.getContent().toString()); + } + } + } } @Test public void nameConflicts() throws XMLDBException { - String query = "let $a := return {$a//@name}"; - - XPathQueryService service = getTestCollection().getService( - XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals(1, result.getSize()); - assertEquals("", result.getResource(0).getContent().toString()); + final String query = "let $a := return {$a//@name}"; + + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("", resource.getContent().toString()); + } + } + } } @Test public void serialization() throws XMLDBException { - @SuppressWarnings("unused") - ResourceSet result; - String query; - @SuppressWarnings("unused") - boolean exceptionThrown; - String message; - - XPathQueryService service = - storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); - - query = "let $a := " + - "return {$a/foo/@name}"; - try { - message = ""; - result = service.query(query); - } catch (XMLDBException e) { - message = e.getMessage(); - } - assertTrue(message.indexOf("XQDY0025") > -1); - - query = "let $a := return $a/@name"; - try { - message = ""; - result = service.query(query); - } catch (XMLDBException e) { - message = e.getMessage(); - } + final XPathQueryService service = storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); + + String query = "let $a := " + + "return {$a/foo/@name}"; + String message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { + message = e.getMessage(); + } + assertTrue(message.indexOf("XQDY0025") > -1); + + query = "let $a := return $a/@name"; + message = ""; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to make sure that result is closed + } catch (final XMLDBException e) { + message = e.getMessage(); + } //TODO : how toserialize this resultand get the error ? -pb //assertTrue(message.indexOf("XQDY0025") > -1); } @@ -1626,10 +1878,10 @@ public void serialization() throws XMLDBException { * @return the large string contained in the atrbute(s) */ private String createXMLContentWithLargeString() { - String large = makeString(stringSize); - String head = "
"; - String elem = ""; - String tail = "
"; + final String large = makeString(stringSize); + final String head = "
"; + final String elem = ""; + final String tail = "
"; xml = head; for (int i = 0; i < nbElem; i++) { xml += elem; @@ -1642,8 +1894,10 @@ private String createXMLContentWithLargeString() { public void retrieveLargeAttribute() throws XMLDBException { createXMLContentWithLargeString(); storeXMLStringAndGetQueryService(file_name, xml); - final XMLResource res = (XMLResource) getTestCollection().getResource(file_name); - assertTrue(res != null); + try (final Collection testCollection = getTestCollection(); + final XMLResource res = (XMLResource) testCollection.getResource(file_name)) { + assertNotNull(res); + } } @Test @@ -1655,22 +1909,24 @@ public void largeAttributeText() throws XMLDBException { XPathQueryService service = storeXMLStringAndGetQueryService(FILE_NAME, xml); String query = "doc('" + FILE_NAME + "') / details/metadata[@docid= '" + large + "' ]"; - ResourceSet result = service.queryResource(FILE_NAME, query); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(FILE_NAME, query)) { + assertEquals(1, result.getSize()); + } xml = "
" + large + "
"; service = storeXMLStringAndGetQueryService(FILE_NAME, xml); query = "doc('"+ FILE_NAME+"') / details/metadata[ docid= '" + large + "' ]"; - result = service.queryResource(FILE_NAME, query); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.queryResource(FILE_NAME, query)) { + assertEquals(1, result.getSize()); + } } @Ignore @Test public void xupdateWithAdjacentTextNodes() throws XMLDBException { - String query = "let $name := xmldb:store('/db' , 'xupdateTest.xml', aaa)" + + final String query = "let $name := xmldb:store('/db' , 'xupdateTest.xml', aaa)" + "let $xu :=" + "" + "" + @@ -1681,10 +1937,10 @@ public void xupdateWithAdjacentTextNodes() throws XMLDBException { "for $textNode in doc('/db/xupdateTest.xml')/test/text()" + " return {$textNode}"; - XPathQueryService service = - storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); - ResourceSet result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); + final XPathQueryService service = storeXMLStringAndGetQueryService(NUMBERS_XML, numbers); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + } } //TODO : understand this test and make sure that the expected result is correct @@ -1692,10 +1948,7 @@ public void xupdateWithAdjacentTextNodes() throws XMLDBException { @Ignore @Test public void xupdateAttributesAndElements() throws XMLDBException { - ResourceSet result; - String query; - - query = + final String query = "declare function local:update-game($game) {\n" + "local:update-frames($game),\n" + "update insert\n" + @@ -1717,28 +1970,30 @@ public void xupdateAttributesAndElements() throws XMLDBException { "let $nul1 := for $game in $series/game return local:update-game($game)\n" + "return $series/game/stats\n"; - XPathQueryService service = - storeXMLStringAndGetQueryService(BOWLING_XML, bowling); - result = service.query(query); - assertEquals("XQuery: " + query, 3, result.getSize()); + final XPathQueryService service = storeXMLStringAndGetQueryService(BOWLING_XML, bowling); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 3, result.getSize()); + } } @Test public void nodeName() throws XMLDBException { - String query = "declare function local:name($node as node()) as xs:string? { " + " if ($node/self::element() != '') then name($node) else () }; " + " let $n := return local:name($n) "; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals("XQuery: " + query, 0, result.getSize()); + final String query = "declare function local:name($node as node()) as xs:string? { " + " if ($node/self::element() != '') then name($node) else () }; " + " let $n := return local:name($n) "; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 0, result.getSize()); + } + } } /** - * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1691112&group_id=17691&atid=117691 + * http://sourceforge.net/tracker/index.php?func=detail&aid=1691112&group_id=17691&atid=117691 */ //DWES Funny in sandbox and REST it fails ; here it is OK... sometimes @Test public void order_1691112() throws XMLDBException { - - String query = "declare namespace tt = \"http://example.com\";" + + final String query = "declare namespace tt = \"http://example.com\";" + "declare function tt:function( $function as element(Function)) {" + " let $functions :=" + " for $subfunction in $function/Function" + @@ -1765,7 +2020,7 @@ public void order_1691112() throws XMLDBException { "return" + " tt:function($funcs)"; - String expectedresult = + final String expectedresult = "\n" + " Airmount 1\n" + " \n" + @@ -1776,33 +2031,39 @@ public void order_1691112() throws XMLDBException { " \n" + ""; - for (int i = 0; i < 25; i++) { // repeat a few times - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals(1, result.getSize()); - assertEquals(expectedresult, result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + for (int i = 0; i < 25; i++) { // repeat a few times + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(expectedresult, resource.getContent().toString()); + } + } + } } } /** - * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1691177&group_id=17691&atid=117691 + * http://sourceforge.net/tracker/index.php?func=detail&aid=1691177&group_id=17691&atid=117691 */ @Test public void attribute_1691177() throws XMLDBException { - String query = "declare namespace xmldb = \"http://exist-db.org/xquery/xmldb\"; " + "let $uri := xmldb:store(\"/db\", \"insertAttribDoc.xml\", ) " + "let $node := doc($uri)/element() " + "let $attrib := /@* " + "return update insert $attrib into $node "; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals("XQuery: " + query, 0, result.getSize()); + final String query = "declare namespace xmldb = \"http://exist-db.org/xquery/xmldb\"; " + "let $uri := xmldb:store(\"/db\", \"insertAttribDoc.xml\", ) " + "let $node := doc($uri)/element() " + "let $attrib := /@* " + "return update insert $attrib into $node "; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 0, result.getSize()); + } + } } /** - * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1691174&group_id=17691&atid=117691 + * http://sourceforge.net/tracker/index.php?func=detail&aid=1691174&group_id=17691&atid=117691 */ @Test public void attribute_1691174() throws XMLDBException { - String query = "declare function local:show($el1, $el2) { " + final String query = "declare function local:show($el1, $el2) { " + " " + " { (\"first: \", $el1, \" second: \", $el2) } " + " " + "}; " @@ -1813,91 +2074,137 @@ public void attribute_1691174() throws XMLDBException { + " , " + " local:attrib(attribute name {\"value\"}) (: Exist bug! :) " + ") "; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + } + } } @Test public void qnameToString_1632365() throws XMLDBException { - String query = "let $qname := QName(\"http://test.org\", \"test:name\") " + + final String query = "let $qname := QName(\"http://test.org\", \"test:name\") " + "return xs:string($qname)"; - String expectedresult = "test:name"; + final String expectedresult = "test:name"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals(expectedresult, result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertEquals(expectedresult, resource.getContent().toString()); + } + } + } } @Test public void comments_1715035() throws XMLDBException { String query = ""; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals(query, result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertEquals(query, resource.getContent().toString()); + } + } - query = "\"?>"; - service = getTestCollection().getService(XPathQueryService.class); - result = service.query(query); - assertEquals(query, result.getResource(0).getContent().toString()); + query = "\"?>"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertEquals(query, resource.getContent().toString()); + } + } + } } @Test public void documentNode_1730690() throws XMLDBException { - String query = "let $doc := document { } " + + final String query = "let $doc := document { } " + "return $doc/root() instance of document-node()"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals("true", result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("true", resource.getContent().toString()); + } + } + } } @Test public void enclosedExpressions() throws XMLDBException, IOException, SAXException { - String query = "let $a := titologiulio " + + final String query = "let $a := titologiulio " + "return {$a/titolo/text()} {' '} {$a/autor/text()}"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo("titolo giulio")); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo("titolo giulio")); + } + } + } } @Test public void orderCompareAtomicType_1733265() throws XMLDBException { String query = "( ) = \"A\""; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals("false", result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("false", resource.getContent().toString()); + } + } - query = "\"A\" = ( )"; - result = service.query(query); - assertEquals("false", result.getResource(0).getContent().toString()); + query = "\"A\" = ( )"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("false", resource.getContent().toString()); + } + } + } } @Test public void positionInPredicate() throws XMLDBException { String query = "let $example := 1 2 " + "return $example/Element[1] "; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals("1", result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent().toString()); + } + } - query = "let $example := 1 2 " + - "return $example/Element[position() = 1] "; - result = service.query(query); - assertEquals("1", result.getResource(0).getContent().toString()); + query = "let $example := 1 2 " + + "return $example/Element[position() = 1] "; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1740880 + * http://sourceforge.net/support/tracker.php?aid=1740880 */ @Test public void elementConstructionWithNamespace_1740880() throws XMLDBException { - String query = "let $a := " + + final String query = "let $a := " + "let $b := element { QName(\"urn:foo\", \"foo:Bar\") } { () } " + "return deep-equal($a, $b) "; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - assertEquals("Oops", "true", result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + try (final Resource resource = result.getResource(0)) { + assertEquals("true", resource.getContent().toString()); + } + } + } } /** @@ -1906,15 +2213,19 @@ public void elementConstructionWithNamespace_1740880() throws XMLDBException { @Test public void noErrorNeOperatorWithSequence_1740883() { try { - String query = "let $foo := A B C " + + final String query = "let $foo := A B C " + "return $foo[Bar ne \"B\"]"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - @SuppressWarnings("unused") - ResourceSet result = service.query(query); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to ensure that result is closed + } - fail("result should have yielded into an error like " + - "'A sequence of more than one item is not allowed as the first " + "operand of 'ne'"); + fail("result should have yielded into an error like " + + "'A sequence of more than one item is not allowed as the first " + "operand of 'ne'"); + } } catch (XMLDBException e) { if (!e.getMessage().contains("one item")) { LOG.error(e.getMessage(), e); @@ -1924,27 +2235,31 @@ public void noErrorNeOperatorWithSequence_1740883() { } /** - * @see http://sourceforge.net/support/tracker.php?aid=1740885 + * http://sourceforge.net/support/tracker.php?aid=1740885 */ @Test public void neOperatorDoesNotWork_1740885() throws XMLDBException { - String query = "let $foo := A B C " + - "return $foo/Bar[. ne \"B\"]"; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(2, result.getSize()); - assertEquals("First", "A", result.getResource(0).getContent().toString()); - assertEquals("Second", "C", result.getResource(1).getContent().toString()); + final String query = "let $foo := A B C return $foo/Bar[. ne \"B\"]"; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("First", "A", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("Second", "C", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1740891 + * http://sourceforge.net/support/tracker.php?aid=1740891 */ @Test public void evalLoosesContext_1740891() throws XMLDBException { - String module = "module namespace tst = \"urn:test\"; " + + final String module = "module namespace tst = \"urn:test\"; " + "declare namespace util = \"http://exist-db.org/xquery/util\";" + "declare function tst:bar() as element(Bar)* { " + "let $foo := " + @@ -1952,36 +2267,46 @@ public void evalLoosesContext_1740891() throws XMLDBException { "let $bar := util:eval($query) " + "return $bar };"; - String module_name = "module.xqy"; - Resource doc; + final String module_name = "module.xqy"; // Store module - Collection testCollection = getTestCollection(); - doc = testCollection.createResource(module_name, BinaryResource.class); - doc.setContent(module); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); + final XPathQueryService service; + try (final Collection testCollection = getTestCollection()) { - String query = "import module namespace tst = \"urn:test\"" + + try (final Resource doc = testCollection.createResource(module_name, BinaryResource.class)) { + doc.setContent(module); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + } + + service = testCollection.getService(XPathQueryService.class); + } + + final String query = "import module namespace tst = \"urn:test\"" + "at \"xmldb:exist:///db/test/module.xqy\"; " + "tst:bar()"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(3, result.getSize()); - assertEquals("First", "", result.getResource(0).getContent().toString()); - assertEquals("Second", "", result.getResource(1).getContent().toString()); - assertEquals("Third", "", result.getResource(2).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(3, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("First", "", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("Second", "", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(2)) { + assertEquals("Third", "", resource.getContent().toString()); + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1740886 + * http://sourceforge.net/support/tracker.php?aid=1740886 */ @Test public void cardinalityIssues_1740886() throws XMLDBException, IOException, SAXException { - String xmldoc = ""; - String query = + final String xmldoc = ""; + final String query = "declare namespace tst = \"urn:test\"; " + "declare option exist:serialize 'indent=no';" + //====== @@ -1992,161 +2317,186 @@ public void cardinalityIssues_1740886() throws XMLDBException, IOException, SAXE "let $foo := doc(\"/db/test/foo.xml\")/element() " + "return tst:bar($foo)"; - XPathQueryService service = storeXMLStringAndGetQueryService("foo.xml", xmldoc); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertThat(result.getResource(0).getContent().toString(), CompareMatcher.isIdenticalTo(xmldoc)); + final XPathQueryService service = storeXMLStringAndGetQueryService("foo.xml", xmldoc); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertThat(resource.getContent().toString(), CompareMatcher.isIdenticalTo(xmldoc)); + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1755910 + * http://sourceforge.net/support/tracker.php?aid=1755910 */ @Test public void qnameString_1755910() throws XMLDBException { - String query = "let $qname1 := QName(\"http://www.w3.org/2001/XMLSchema\", \"xs:element\") " + "let $qname2 := QName(\"http://foo.com\", \"foo:bar\") " + "return (xs:string($qname1), xs:string($qname2))"; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(2, result.getSize()); - - assertEquals("First", "xs:element", result.getResource(0).getContent().toString()); - assertEquals("Second", "foo:bar", result.getResource(1).getContent().toString()); + final String query = "let $qname1 := QName(\"http://www.w3.org/2001/XMLSchema\", \"xs:element\") " + "let $qname2 := QName(\"http://foo.com\", \"foo:bar\") " + "return (xs:string($qname1), xs:string($qname2))"; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("First", "xs:element", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("Second", "foo:bar", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1665215 + * http://sourceforge.net/support/tracker.php?aid=1665215 */ @Test public void predicateMinLast_1665215() throws XMLDBException { - String query = "declare option exist:serialize 'indent=no';" + + final String query = "declare option exist:serialize 'indent=no';" + "let $data :=1234" + "return {$data/child[min((last(),3))]}"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals("First", "3", result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("First", "3", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1665213 + * http://sourceforge.net/support/tracker.php?aid=1665213 */ @Test public void predicatePositionLast_1665213() throws XMLDBException { // OK, regression String query = "(1, 2, 3)[ position() = last() ]"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals("First", "3", result.getResource(0).getContent().toString()); - - - query = "(1, 2, 3)[(position()=last() and position() < 4)]"; - - service = getTestCollection().getService(XPathQueryService.class); - result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals("First", "3", result.getResource(0).getContent().toString()); - + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("First", "3", resource.getContent().toString()); + } + } - query = "(1, 2, 3)[(position()=last())]"; - service = getTestCollection().getService(XPathQueryService.class); - result = service.query(query); + query = "(1, 2, 3)[(position()=last() and position() < 4)]"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("First", "3", resource.getContent().toString()); + } + } - assertEquals(1, result.getSize()); - assertEquals("First", "3", result.getResource(0).getContent().toString()); + query = "(1, 2, 3)[(position()=last())]"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("First", "3", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1769086 + * http://sourceforge.net/support/tracker.php?aid=1769086 */ @Test public void cce_IndexOf_1769086() throws XMLDBException { - String query = "(\"One\", \"Two\", \"Three\")[index-of((\"1\", \"2\", \"3\"), \"2\")]"; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals("First", "Two", result.getResource(0).getContent().toString()); + final String query = "(\"One\", \"Two\", \"Three\")[index-of((\"1\", \"2\", \"3\"), \"2\")]"; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("First", "Two", resource.getContent().toString()); + } + } + } } @Test public void shortVersionPositionPredicate() throws XMLDBException { - String query = "declare option exist:serialize 'indent=no';" + "let $foo := " + "let $bar1 := $foo/bar[exists(@baz)][1]" + "let $bar2 := $foo/bar[exists(@baz)][position() = 1]" + "return {$bar1} {$bar2} "; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "", result.getResource(0).getContent().toString()); + final String query = "declare option exist:serialize 'indent=no';" + "let $foo := " + "let $bar1 := $foo/bar[exists(@baz)][1]" + "let $bar2 := $foo/bar[exists(@baz)][position() = 1]" + "return {$bar1} {$bar2} "; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "", resource.getContent().toString()); + } + } + } } /*** * An exception occurred during query execution: XPTY0004: Invalid type for * variable $arg1. Expected xs:string, got xs:integer * - * @see http://sourceforge.net/tracker/index.php?func=detail&aid=1787285&group_id=17691&atid=117691 + * http://sourceforge.net/tracker/index.php?func=detail&aid=1787285&group_id=17691&atid=117691 */ @Test public void wrongInvalidTypeError_1787285() throws XMLDBException { - String query = "let $arg1 as xs:string := \"A String\"" + "let $arg2 as xs:integer := 3 return $arg2"; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "3", result.getResource(0).getContent().toString()); + final String query = "let $arg1 as xs:string := \"A String\"" + "let $arg2 as xs:integer := 3 return $arg2"; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "3", resource.getContent().toString()); + } + } + } } /** * Regression * - * @see http://sourceforge.net/support/tracker.php?aid=1805612 + * http://sourceforge.net/support/tracker.php?aid=1805612 * * Same as {@link #asDouble_1840775()} */ @Ignore @Test public void wrongAttributeTypeCheck_1805612() throws XMLDBException { - // OK String query = "declare namespace tst = \"http://test\"; " + "declare function tst:foo($a as element()?) { $a }; " + "tst:foo( )"; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "", resource.getContent().toString()); + } + } - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "", result.getResource(0).getContent().toString()); - - // NOK - query = "declare namespace tst = \"http://test\"; " - + "declare function tst:foo($a as element()?) { $a }; " - + "tst:foo( " - + " let $a as xs:boolean := true() " - + " return " - + ")"; - - service = getTestCollection().getService(XPathQueryService.class); - result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "", result.getResource(0).getContent().toString()); + // NOK + query = "declare namespace tst = \"http://test\"; " + + "declare function tst:foo($a as element()?) { $a }; " + + "tst:foo( " + + " let $a as xs:boolean := true() " + + " return " + + ")"; + + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "", resource.getContent().toString()); + } + } + } } /** * Regression * - * @see http://sourceforge.net/support/tracker.php?aid=1805609 + * http://sourceforge.net/support/tracker.php?aid=1805609 */ @Test public void wrongAttributeCardinalityCount_1805609() throws XMLDBException { @@ -2154,66 +2504,72 @@ public void wrongAttributeCardinalityCount_1805609() throws XMLDBException { // OK String query = "element {\"a\"} { /attribute()[namespace-uri(.) != " + "\"http://www.asml.com/metainformation\"]}"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "", result.getResource(0).getContent().toString()); - - // NOK - query = "element {\"a\"} { " + "/attribute()[namespace-uri(.) != \"http://www.asml.com/metainformation\"]}"; - - service = getTestCollection().getService(XPathQueryService.class); - result = service.query(query); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "", resource.getContent().toString()); + } + } - assertEquals(1, result.getSize()); - assertEquals(query, "", result.getResource(0).getContent().toString()); + // NOK + query = "element {\"a\"} { " + "/attribute()[namespace-uri(.) != \"http://www.asml.com/metainformation\"]}"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "", resource.getContent().toString()); + } + } + } } /** * Regression * - * @see http://sourceforge.net/support/tracker.php?aid=1806901 + * http://sourceforge.net/support/tracker.php?aid=1806901 */ @Test public void doubleDefaultNamespace_1806901() throws XMLDBException { // OK - String query = "declare namespace xf = \"http://a\"; " + "declare option exist:serialize 'indent=no';" + ""; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "" + "", - result.getResource(0).getContent().toString()); + final String query = "declare namespace xf = \"http://a\"; " + "declare option exist:serialize 'indent=no';" + ""; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "" + "", + resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1828168 + * http://sourceforge.net/support/tracker.php?aid=1828168 */ @Test public void predicateInPredicateEmptyResult_1828168() throws XMLDBException { String query = "let $docs := return $docs[a[1] = 'b']"; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(0, result.getSize()); + } - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(0, result.getSize()); - - query = "[() = 'b']"; - - service = getTestCollection().getService(XPathQueryService.class); - result = service.query(query); - - assertEquals(0, result.getSize()); + query = "[() = 'b']"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(0, result.getSize()); + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1846228 + * http://sourceforge.net/support/tracker.php?aid=1846228 */ @Test public void namespaceHandlingSameModule_1846228() throws XMLDBException { - String query = "declare option exist:serialize 'indent=no';" + + final String query = "declare option exist:serialize 'indent=no';" + "declare function local:table () {" + "Bar};" + "" + @@ -2221,136 +2577,151 @@ public void namespaceHandlingSameModule_1846228() throws XMLDBException { "{local:table()}" + ""; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, - "" + - "Foo" + - "Bar" + - "", result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, + "" + + "Foo" + + "Bar" + + "", resource.getContent().toString()); + } + } + } } /** * In a path expression, a step returning an empty sequence stops the evaluation * (and return an empty sequence) as confirmed by Michael Kay on the XQuery mailing list * - * @see http://sourceforge.net/support/tracker.php?aid=1841105 + * @see http://sourceforge.net/support/tracker.php?aid=1841105 */ @Test public void stringOfEmptySequence_1841105() throws XMLDBException { // OK - String query = "empty( ()/string() )"; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "true", - result.getResource(0).getContent().toString()); + final String query = "empty( ()/string() )"; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "true", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=2871975 + * http://sourceforge.net/support/tracker.php?aid=2871975 */ @Ignore @Test public void stringOfEmptySequenceWithExplicitContext_2871975() throws XMLDBException { - // OK String query = "empty( ()/string() )"; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "true", resource.getContent().toString()); + } + } - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "true", - result.getResource(0).getContent().toString()); - - // NOK - query = "empty( ()/string(.) )"; - - service = getTestCollection().getService(XPathQueryService.class); - result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "true", - result.getResource(0).getContent().toString()); + // NOK + query = "empty( ()/string(.) )"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "true", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1970717 + * http://sourceforge.net/support/tracker.php?aid=1970717 */ @Test public void constructTextNodeWithEmptyString_1970717() throws XMLDBException { - String query = "text {\"\"} =\"\""; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "true", - result.getResource(0).getContent().toString()); + final String query = "text {\"\"} =\"\""; + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "true", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1848497 + * http://sourceforge.net/support/tracker.php?aid=1848497 */ @Ignore @Test public void attributeNamespaceDeclaration_1848497() throws XMLDBException { - String query = "declare namespace foo = \"foo\";" + + final String query = "declare namespace foo = \"foo\";" + "declare function foo:boe() { \"boe\" };" + "{ foo2:boe() }"; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "boe", - result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "boe", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1884403 + * http://sourceforge.net/support/tracker.php?aid=1884403 */ @Test public void atomization_1884403() throws XMLDBException { - String query = "declare namespace tst = \"tt\"; " + + final String query = "declare namespace tst = \"tt\"; " + "declare function tst:foo() as xs:string { myTxt }; " + "tst:foo()"; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "myTxt", - result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "myTxt", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1884360 + * http://sourceforge.net/support/tracker.php?aid=1884360 */ @Test public void cardinalityAttributeNamespace_1884360() throws XMLDBException { - String query = "let $el := " + + final String query = "let $el := " + "for $attr in $el/attribute()[namespace-uri(.) ne \"h\"] " + "return {$attr}"; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(2, result.getSize()); - assertEquals(query, "", - result.getResource(0).getContent().toString()); - assertEquals(query, "", - result.getResource(1).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals(query, "", resource.getContent().toString()); + } + } + } } @Test public void currentDateTimeInModules_1894009() throws XMLDBException { - String module = "module namespace dt = \"dt\";\n" + + final String module = "module namespace dt = \"dt\";\n" + "\n" + "declare function dt:fib($n) {\n" + " if ($n < 2) then $n else dt:fib($n - 1) + dt:fib($n - 2) \n" + @@ -2362,71 +2733,78 @@ public void currentDateTimeInModules_1894009() throws XMLDBException { " return current-dateTime()\n" + "};"; - String module_name = "dt.xqm"; - Resource doc; + final String module_name = "dt.xqm"; // Store module - Collection testCollection = getTestCollection(); - doc = testCollection.createResource(module_name, BinaryResource.class); - doc.setContent(module); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); + final XPathQueryService service; + try (final Collection testCollection = getTestCollection()) { + + try (final Resource doc = testCollection.createResource(module_name, BinaryResource.class)) { + doc.setContent(module); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + + service = testCollection.getService(XPathQueryService.class); + } + } - String query = "import module namespace dt = \"dt\" at" + + final String query = "import module namespace dt = \"dt\" at" + " \"xmldb:exist:///db/test/dt.xqm\"; " + "({current-dateTime()}, {dt:dateTime()})"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(2, result.getSize()); - assertEquals("First", result.getResource(0).getContent().toString(), - result.getResource(1).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource0 = result.getResource(0); + final Resource resource1 = result.getResource(1)) { + assertEquals(2, result.getSize()); + assertEquals("First", resource0.getContent().toString(), resource1.getContent().toString()); + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1909505 + * http://sourceforge.net/support/tracker.php?aid=1909505 */ @Test public void testXmldbStoreComment_1909505() throws XMLDBException { - String query = "declare option exist:serialize 'indent=no';" + + final String query = "declare option exist:serialize 'indent=no';" + "let $docIn := " + "let $uri := xmldb:store(\"/db\", \"commenttest.xml\", $docIn)" + "let $docOut := doc($uri) return $docOut"; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "", - result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1938498 + * http://sourceforge.net/support/tracker.php?aid=1938498 */ @Test public void memproc_1938498() throws XMLDBException { - String xmldocument = ""; - String location = "1938498.xml"; - String query = - "let $test := doc(\"1938498.xml\")" + "let $inmems := {$test}" + "return {$inmems/X}"; - String output = ""; + final String xmldocument = ""; + final String location = "1938498.xml"; + final String query = "let $test := doc(\"1938498.xml\")" + "let $inmems := {$test}" + "return {$inmems/X}"; + final String output = ""; - XPathQueryService service = - storeXMLStringAndGetQueryService(location, xmldocument); + final XPathQueryService service = storeXMLStringAndGetQueryService(location, xmldocument); - ResourceSet result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, output, - result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, output, resource.getContent().toString()); + } + } } @Test public void cce_SaxException() throws XMLDBException { - String xmldocument = "mmm"; - String location = "ccesax.xml"; - String query = + final String xmldocument = "mmm"; + final String location = "ccesax.xml"; + final String query = "declare namespace xmldb = \"http://exist-db.org/xquery/xmldb\"; " + "declare option exist:serialize 'indent=no';" + "let $results := doc(\"ccesax.xml\")/element() " @@ -2435,34 +2813,39 @@ public void cce_SaxException() throws XMLDBException { + "let $store := xmldb:store(\"/db\", \"output.xml\", $output)" + "return doc('/db/output.xml')"; // String output = "mmm"; - String output = "mmm"; + final String output = "mmm"; - XPathQueryService service = - storeXMLStringAndGetQueryService(location, xmldocument); + final XPathQueryService service = storeXMLStringAndGetQueryService(location, xmldocument); - ResourceSet result = service.query(query); - assertEquals("XQuery: " + query, 1, result.getSize()); - assertEquals("XQuery: " + query, output, - result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, output, resource.getContent().toString()); + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=2003042 + * http://sourceforge.net/support/tracker.php?aid=2003042 */ @Test public void xpty0018_MixNodesAtomicValues_2003042() throws XMLDBException { - String query = "declare option exist:serialize 'indent=no'; {2}"; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "2", //checked with saxon - result.getResource(0).getContent().toString()); + final String query = "declare option exist:serialize 'indent=no'; {2}"; + + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + //checked with saxon + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "2", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1816496 + * http://sourceforge.net/support/tracker.php?aid=1816496 */ @Test public void divYieldsWrongInf_1816496() throws XMLDBException { @@ -2475,54 +2858,79 @@ public void divYieldsWrongInf_1816496() throws XMLDBException { +"(xs:double(0) div xs:double(0)) " +")"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(11, result.getSize()); - - assertEquals(query, "INF", result.getResource(0).getContent().toString()); - assertEquals(query, "INF", result.getResource(1).getContent().toString()); - assertEquals(query, "-INF", result.getResource(2).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(11, result.getSize()); - assertEquals(query, "-INF", result.getResource(3).getContent().toString()); - assertEquals(query, "-INF", result.getResource(4).getContent().toString()); - assertEquals(query, "INF", result.getResource(5).getContent().toString()); - - assertEquals(query, "NaN", result.getResource(6).getContent().toString()); - assertEquals(query, "NaN", result.getResource(7).getContent().toString()); - assertEquals(query, "NaN", result.getResource(8).getContent().toString()); - assertEquals(query, "NaN", result.getResource(9).getContent().toString()); - assertEquals(query, "NaN", result.getResource(10).getContent().toString()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "INF", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals(query, "INF", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(2)) { + assertEquals(query, "-INF", resource.getContent().toString()); + } - query = "xs:float(2) div xs:float(0)"; + try (final Resource resource = result.getResource(3)) { + assertEquals(query, "-INF", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(4)) { + assertEquals(query, "-INF", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(5)) { + assertEquals(query, "INF", resource.getContent().toString()); + } - service = getTestCollection().getService(XPathQueryService.class); - result = service.query(query); + try (final Resource resource = result.getResource(6)) { + assertEquals(query, "NaN", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(7)) { + assertEquals(query, "NaN", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(8)) { + assertEquals(query, "NaN", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(9)) { + assertEquals(query, "NaN", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(10)) { + assertEquals(query, "NaN", resource.getContent().toString()); + } + } - assertEquals(1, result.getSize()); - assertEquals(query, "INF", - result.getResource(0).getContent().toString()); + query = "xs:float(2) div xs:float(0)"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "INF", + resource.getContent().toString()); + } + } + } } /** - * @see https://github.com/eXist-db/exist/issues/3441 + * https://github.com/eXist-db/exist/issues/3441 */ @Test public void divErrorArgVariable() throws XMLDBException { - String query = "let $x := 2 " + + final String query = "let $x := 2 " + "return 1 div $x * 4"; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - - assertEquals(query, "2", result.getResource(0).getContent().toString()); - + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "2", resource.getContent().toString()); + } + } + } } /** - * @see https://github.com/eXist-db/exist/issues/3441 + * https://github.com/eXist-db/exist/issues/3441 */ @Test public void divErrorArgVariable2() throws XMLDBException { @@ -2530,53 +2938,57 @@ public void divErrorArgVariable2() throws XMLDBException { "let $y := 1 div $x * 4\n" + "return $y"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - - assertEquals(query, "2", result.getResource(0).getContent().toString()); - + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "2", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1841635 + * http://sourceforge.net/support/tracker.php?aid=1841635 */ @Test public void resolveBaseURI_1841635() throws XMLDBException { - String xmldoc = ""; + final String xmldoc = ""; - XPathQueryService service = storeXMLStringAndGetQueryService("baseuri.xml", xmldoc); + final XPathQueryService service = storeXMLStringAndGetQueryService("baseuri.xml", xmldoc); - String query="doc('/db/test/baseuri.xml')/Root/Node1/base-uri()"; - - - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals("/db/test/baseuri.xml", result.getResource(0).getContent().toString()); + String query = "doc('/db/test/baseuri.xml')/Root/Node1/base-uri()"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("/db/test/baseuri.xml", resource.getContent().toString()); + } + } query = "doc('/db/test/baseuri.xml')/Root/Node1/base-uri()"; - - result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals("/db/test/baseuri.xml", result.getResource(0).getContent().toString()); - + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("/db/test/baseuri.xml", resource.getContent().toString()); + } + } query = "doc('/db/test/baseuri.xml')/Root/Node1/Node2/base-uri()"; - - result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals("/db/test/baseuri.xml", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("/db/test/baseuri.xml", resource.getContent().toString()); + } + } query = "doc('/db/test/baseuri.xml')/Root/Node1/Node2/Node3/base-uri()"; - - result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals("/db/test/baseuri.xml", result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("/db/test/baseuri.xml", resource.getContent().toString()); + } + } } /** @@ -2587,16 +2999,17 @@ public void resolveBaseURIErrorCases() throws XMLDBException { final XPathQueryService service = existEmbeddedServer.getRoot().getService(XPathQueryService.class); String query = "()/fn:base-uri()"; - ResourceSet result = service.query(query); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(0, result.getSize()); + } query = "()/base-uri(.)"; - result = service.query(query); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(0, result.getSize()); + } query = "base-uri(.)"; - try { - result = service.query(query); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { assertEquals(0, result.getSize()); fail("Should have raised error: XPDY0002"); @@ -2610,21 +3023,25 @@ public void resolveBaseURIErrorCases() throws XMLDBException { } /** - * @see http://sourceforge.net/support/tracker.php?aid=2429093 + * http://sourceforge.net/support/tracker.php?aid=2429093 */ @Test public void xpty0018_mixedsequences_2429093() throws XMLDBException { String query = "declare variable $a := ;\n" + "($a/B, \"delete\") "; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(2, result.getSize()); - assertEquals(query, "", - result.getResource(0).getContent().toString()); - assertEquals(query, "delete", - result.getResource(1).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals(query, "delete", resource.getContent().toString()); + } + } + } } @Test @@ -2634,59 +3051,74 @@ public void messageDigester() throws XMLDBException { "return\n" + "(util:hash($value, $alg), util:hash($value, $alg, xs:boolean('true')))"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(2, result.getSize()); - assertEquals(query, "8827a41122a5028b9808c7bf84b9fcf6", - result.getResource(0).getContent().toString()); - assertEquals(query, "iCekESKlAouYCMe/hLn89g==", - result.getResource(1).getContent().toString()); - - query = "let $value:=\"ABCDEF\"\n" + - "let $alg:=\"SHA-1\"\n" + - "return\n" + - "(util:hash($value, $alg), util:hash($value, $alg, xs:boolean('true')))"; - - service = getTestCollection().getService(XPathQueryService.class); - result = service.query(query); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "8827a41122a5028b9808c7bf84b9fcf6", + resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals(query, "iCekESKlAouYCMe/hLn89g==", + resource.getContent().toString()); + } + } - assertEquals(2, result.getSize()); - assertEquals(query, "970093678b182127f60bb51b8af2c94d539eca3a", - result.getResource(0).getContent().toString()); - assertEquals(query, "lwCTZ4sYISf2C7UbivLJTVOeyjo=", - result.getResource(1).getContent().toString()); + query = "let $value:=\"ABCDEF\"\n" + + "let $alg:=\"SHA-1\"\n" + + "return\n" + + "(util:hash($value, $alg), util:hash($value, $alg, xs:boolean('true')))"; - query = "let $value:=\"ABCDEF\"\n" + - "let $alg:=\"SHA-256\"\n" + - "return\n" + - "(util:hash($value, $alg), util:hash($value, $alg, xs:boolean('true')))"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "970093678b182127f60bb51b8af2c94d539eca3a", + resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals(query, "lwCTZ4sYISf2C7UbivLJTVOeyjo=", + resource.getContent().toString()); + } + } - service = getTestCollection().getService(XPathQueryService.class); - result = service.query(query); + query = "let $value:=\"ABCDEF\"\n" + + "let $alg:=\"SHA-256\"\n" + + "return\n" + + "(util:hash($value, $alg), util:hash($value, $alg, xs:boolean('true')))"; - assertEquals(2, result.getSize()); - assertEquals(query, "e9c0f8b575cbfcb42ab3b78ecc87efa3b011d9a5d10b09fa4e96f240bf6a82f5", - result.getResource(0).getContent().toString()); - assertEquals(query, "6cD4tXXL/LQqs7eOzIfvo7AR2aXRCwn6TpbyQL9qgvU=", - result.getResource(1).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "e9c0f8b575cbfcb42ab3b78ecc87efa3b011d9a5d10b09fa4e96f240bf6a82f5", + resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals(query, "6cD4tXXL/LQqs7eOzIfvo7AR2aXRCwn6TpbyQL9qgvU=", + resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/tracker/?func=detail&aid=2846187&group_id=17691&atid=317691 + * http://sourceforge.net/tracker/?func=detail&aid=2846187&group_id=17691&atid=317691 */ @Test public void dynamicallySizedNamePool() throws XMLDBException { - String query = " { for $i in 1 to 2000 " + final String query = " { for $i in 1 to 2000 " + "return element {concat(\"elt-\", $i)} {} } "; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - service.query(query); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to ensure that result is closed + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=2903815 + * http://sourceforge.net/support/tracker.php?aid=2903815 */ @Test public void replaceBug_2903815() throws XMLDBException { @@ -2695,68 +3127,78 @@ public void replaceBug_2903815() throws XMLDBException { "let $t := t" + "return replace($s,$t,$f)"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "xxxxfredxxx", - result.getResource(0).getContent().toString()); - - query = "let $f := \"fred\"" + - "let $s:= xxxxtxxx" + - "let $t := t" + - "return replace($s,$t,$f)"; - - service = getTestCollection().getService(XPathQueryService.class); - result = service.query(query); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "xxxxfredxxx", + resource.getContent().toString()); + } + } - assertEquals(1, result.getSize()); - assertEquals(query, "xxxxfredxxx", - result.getResource(0).getContent().toString()); + query = "let $f := \"fred\"" + + "let $s:= xxxxtxxx" + + "let $t := t" + + "return replace($s,$t,$f)"; + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "xxxxfredxxx", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1840775 + * http://sourceforge.net/support/tracker.php?aid=1840775 * * Same as {@link #wrongAttributeTypeCheck_1805612()} */ @Ignore @Test public void asDouble_1840775() throws XMLDBException { - String query = "declare function local:testCase($failure as element(Failure)?)" + final String query = "declare function local:testCase($failure as element(Failure)?)" + "as element(TestCase) { };" + "local:testCase(" + "(: work-around for this eXist 1.1.2dev-rev:6992-20071127 bug: let $ltValue := 0.0 :)" + "let $ltValue as xs:double := 0.0e0 return )"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - service.query(query); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to ensure that result is closed + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=2117655 + * http://sourceforge.net/support/tracker.php?aid=2117655 */ @Test public void typeMismatch_2117655() throws XMLDBException { - String query = "declare namespace t = \"test\"; " + final String query = "declare namespace t = \"test\"; " +"declare function t:foo() as xs:string{" + "23}; " + "t:foo()"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "23", - result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "23", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1959010 + * http://sourceforge.net/support/tracker.php?aid=1959010 */ @Test public void noNamepaceDefinedForPrefix_1959010() throws XMLDBException { - String query = + final String query = "declare function local:copy($nodes as node()*) as node()* " +"{ " +"for $n in $nodes " @@ -2774,66 +3216,78 @@ public void noNamepaceDefinedForPrefix_1959010() throws XMLDBException { +"let $c := ccc " +"return local:copy($c)"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "ccc", - result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "ccc", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1807014 + * http://sourceforge.net/support/tracker.php?aid=1807014 */ @Test public void wrongAddNamespace_1807014() throws XMLDBException { - Collection testCollection = getTestCollection(); - Resource doc = testCollection.createResource("a.xqy", BinaryResource.class); - doc.setContent("module namespace a = \"http://www.a.com\"; " - +"declare function a:selectionList() as element(ul) { " - +"
    " - +"};"); - ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); - testCollection.storeResource(doc); - - String query = - "declare option exist:serialize 'indent=no';" - +"import module namespace a = \"http://www.a.com\" at \"xmldb:exist://db/test/a.xqy\"; " - +" " - +"{ a:selectionList() } " - +""; + final XPathQueryService service; + try (final Collection testCollection = getTestCollection()) { + + try (final Resource doc = testCollection.createResource("a.xqy", BinaryResource.class)) { + doc.setContent("module namespace a = \"http://www.a.com\"; " + + "declare function a:selectionList() as element(ul) { " + + "
      " + + "};"); + ((EXistResource) doc).setMediaType(MediaType.APPLICATION_XQUERY); + testCollection.storeResource(doc); + + service = testCollection.getService(XPathQueryService.class); + } + } - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); + final String query = + "declare option exist:serialize 'indent=no';" + + "import module namespace a = \"http://www.a.com\" at \"xmldb:exist://db/test/a.xqy\"; " + + " " + + "{ a:selectionList() } " + + ""; - assertEquals(1, result.getSize()); - assertEquals(query, "" - +"
        ", - result.getResource(0).getContent().toString()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "" + + "
          ", + resource.getContent().toString()); + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1789370 + * http://sourceforge.net/support/tracker.php?aid=1789370 */ @Test public void orderBy_1789370() throws XMLDBException { - String query = + final String query = "(for $vi in text order by $vi return $vi)/text()"; - - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, "text", - result.getResource(0).getContent().toString()); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "text", resource.getContent().toString()); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1817822 + * http://sourceforge.net/support/tracker.php?aid=1817822 */ @Test public void variableScopeBug_1817822() throws XMLDBException { - String query = + final String query = "declare namespace test = \"http://example.com\"; " +"declare function test:expression($expr) as xs:double? { " +" typeswitch($expr) " @@ -2857,20 +3311,23 @@ public void variableScopeBug_1817822() throws XMLDBException { +"let $b := test:product($values) " +"return {$b}"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(1, result.getSize()); - assertEquals(query, - result.getResource(0).getContent().toString(), "6"); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, resource.getContent().toString(), "6"); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1718626 + * http://sourceforge.net/support/tracker.php?aid=1718626 */ @Test public void constructednodePosition_1718626() throws XMLDBException { - String query = + final String query = "declare variable $categories := " +" " +" Fruit " @@ -2883,22 +3340,26 @@ public void constructednodePosition_1718626() throws XMLDBException { +" $categories/category[1], " +" $categories/category[position() eq 1]"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(2, result.getSize()); - assertEquals(query, - result.getResource(0).getContent().toString(), "Fruit"); - assertEquals(query, - result.getResource(1).getContent().toString(), "Fruit"); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, resource.getContent().toString(), "Fruit"); + } + try (final Resource resource = result.getResource(1)) { + assertEquals(query, resource.getContent().toString(), "Fruit"); + } + } + } } /** - * @see http://sourceforge.net/support/tracker.php?aid=1460791 + * http://sourceforge.net/support/tracker.php?aid=1460791 */ @Test public void descendantOrSelf_1460791() throws XMLDBException { - String query = + final String query = "declare option exist:serialize 'indent=no';" +"let $test:= aaa zzz " +"return " @@ -2908,32 +3369,35 @@ public void descendantOrSelf_1460791() throws XMLDBException { +"(: note that these should be the same *by definition* :) " +")"; - XPathQueryService service = getTestCollection().getService(XPathQueryService.class); - ResourceSet result = service.query(query); - - assertEquals(2, result.getSize()); - assertEquals(query, - result.getResource(0).getContent().toString(), " zzz "); - assertEquals(query, - result.getResource(1).getContent().toString(), " zzz "); + try (final Collection testCollection = getTestCollection()) { + final XPathQueryService service = testCollection.getService(XPathQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, resource.getContent().toString(), " zzz "); + } + try (final Resource resource = result.getResource(1)) { + assertEquals(query, resource.getContent().toString(), " zzz "); + } + } + } } @Test public void attributesSerialization() throws XMLDBException { - final XPathQueryService service = - storeXMLStringAndGetQueryService(attributesSERIALIZATION, attributes); + final XPathQueryService service = storeXMLStringAndGetQueryService(attributesSERIALIZATION, attributes); String query = "//@* \n"; - ResourceSet result = null; - try { - result = service.query(query); - } catch (Exception e) { + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + // needed to ensure that result is closed + } catch (final Exception e) { //SENR0001 : OK - this is expected } query = "declare option exist:serialize 'method=text'; \n" + "//@* \n"; - result = service.query(query); - assertEquals("XQuery: " + query, 3, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals("XQuery: " + query, 3, result.getSize()); + } } @Test(expected=XPathException.class) @@ -2941,7 +3405,9 @@ public void pathOperatorContainingNodesAndNonNodes() throws XMLDBException, XPat final String query = "declare function local:test() { (1,) };\n" + "/local:test()"; try { - existEmbeddedServer.executeQuery(query); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + // needed to ensure that result set is closed + } } catch(final XMLDBException e) { if(e.getCause() instanceof XPathException xpe) { assertEquals(ErrorCodes.XPTY0018, xpe.getErrorCode()); @@ -2956,26 +3422,34 @@ public void pathOperatorContainingNodesAndNonNodes() throws XMLDBException, XPat public void exprContainingNodesAndNonNodes() throws XMLDBException, XPathException { final String query = "declare function local:test() { (1,) };\n" + "local:test()"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - - assertEquals(2, result.getSize()); - assertEquals("1", result.getResource(0).getContent().toString()); - assertEquals("", result.getResource(1).getContent().toString()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("", resource.getContent().toString()); + } + } } /** - * @see https://github.com/eXist-db/exist/issues/1121 + * https://github.com/eXist-db/exist/issues/1121 */ @Test public void multipleExprsContainingNodesAndNonNodes() throws XMLDBException, XPathException { final String query = "declare variable $a := 'a';\n" + "declare function local:test() { (1,) };\n" + "local:test()"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - - assertEquals(2, result.getSize()); - assertEquals("1", result.getResource(0).getContent().toString()); - assertEquals("", result.getResource(1).getContent().toString()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)){ + assertEquals(2, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("1", resource.getContent().toString()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("", resource.getContent().toString()); + } + } } // ====================================== @@ -2983,17 +3457,12 @@ public void multipleExprsContainingNodesAndNonNodes() throws XMLDBException, XPa * @return * @throws XMLDBException */ - private XPathQueryService storeXMLStringAndGetQueryService(String documentName, - String content) throws XMLDBException { - Collection testCollection = getTestCollection(); - XMLResource doc = - testCollection.createResource( - documentName, XMLResource.class); - doc.setContent(content); - testCollection.storeResource(doc); - XPathQueryService service = - testCollection.getService( - XPathQueryService.class); - return service; + private XPathQueryService storeXMLStringAndGetQueryService(final String documentName, final String content) throws XMLDBException { + try (final Collection testCollection = getTestCollection(); + final XMLResource doc = testCollection.createResource(documentName, XMLResource.class)) { + doc.setContent(content); + testCollection.storeResource(doc); + return testCollection.getService(XPathQueryService.class); + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/XmldbBinariesTest.java b/exist-core/src/test/java/org/exist/xquery/XmldbBinariesTest.java index 14680868d4..de3503142a 100644 --- a/exist-core/src/test/java/org/exist/xquery/XmldbBinariesTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XmldbBinariesTest.java @@ -46,12 +46,16 @@ package org.exist.xquery; import org.exist.test.ExistWebServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.XmldbURI; import org.junit.ClassRule; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.CompiledExpression; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XQueryService; @@ -68,7 +72,7 @@ * @author Adam Retter */ @RunWith(Parameterized.class) -public class XmldbBinariesTest extends AbstractBinariesTest { +public class XmldbBinariesTest extends AbstractBinariesTest { @ClassRule public static final ExistWebServer existWebServer = new ExistWebServer(true, false, true, true); @@ -94,7 +98,7 @@ private final String getBaseUri() { @Override protected void storeBinaryFile(final XmldbURI filePath, byte[] content) throws Exception { - try (Collection colRoot = DatabaseManager.getCollection(getBaseUri() + "/db", ADMIN_DB_USER, ADMIN_DB_PWD)) { + try (final Collection colRoot = DatabaseManager.getCollection(getBaseUri() + "/db", ADMIN_DB_USER, ADMIN_DB_PWD)) { final XmldbURI collectionNames[] = filePath.removeLastSegment().getPathSegments(); @@ -103,20 +107,21 @@ protected void storeBinaryFile(final XmldbURI filePath, byte[] content) throws E Collection current = colRoot; for (int i = 1; i < collectionNames.length; i++) { final Collection child = getOrCreateCollection(current, collectionNames[i].toString()); - cols.push(child); + cols.addFirst(child); current = child; } final String fileName = filePath.lastSegment().toString(); - final Resource resource = current.createResource(fileName, BinaryResource.class); - resource.setContent(content); - current.storeResource(resource); + try (final Resource resource = current.createResource(fileName, BinaryResource.class)) { + resource.setContent(content); + current.storeResource(resource); + } } finally { while (!cols.isEmpty()) { try { - cols.pop().close(); - } catch (XMLDBException e) { + cols.removeFirst().close(); + } catch (final XMLDBException e) { } } @@ -135,9 +140,9 @@ private Collection getOrCreateCollection(final Collection parent, final String c @Override protected void removeCollection(final XmldbURI collectionUri) throws Exception { - try (Collection colRoot = DatabaseManager.getCollection(getBaseUri() + "/db", ADMIN_DB_USER, ADMIN_DB_PWD)) { + try (final Collection colRoot = DatabaseManager.getCollection(getBaseUri() + "/db", ADMIN_DB_USER, ADMIN_DB_PWD)) { - try (Collection colTest = colRoot.getChildCollection("test")) { + try (final Collection colTest = colRoot.getChildCollection("test")) { final CollectionManagementService cms = colTest.getService(CollectionManagementService.class); final String testCollectionName = collectionUri.lastSegment().toString(); @@ -147,13 +152,13 @@ protected void removeCollection(final XmldbURI collectionUri) throws Exception { } @Override - protected QueryResultAccessor executeXQuery(final String query) { + protected QueryResultAccessor executeXQuery(final String query) { return consumer -> { try (Collection colRoot = DatabaseManager.getCollection(getBaseUri() + "/db", ADMIN_DB_USER, ADMIN_DB_PWD)) { final XQueryService xqueryService = colRoot.getService(XQueryService.class); final CompiledExpression compiledExpression = xqueryService.compile(query); - final ResourceSet results = xqueryService.execute(compiledExpression); + final EXistResourceSet results = (EXistResourceSet) xqueryService.execute(compiledExpression); try { @@ -170,12 +175,12 @@ protected QueryResultAccessor executeXQuery(final S } @Override - protected long size(final ResourceSet results) throws XMLDBException { + protected long size(final EXistResourceSet results) throws XMLDBException { return results.getSize(); } @Override - protected Resource item(final ResourceSet results, final int index) throws XMLDBException { + protected Resource item(final EXistResourceSet results, final int index) throws XMLDBException { return results.getResource(index); } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/DocTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/DocTest.java index eb530dab99..0d1ea6c393 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/DocTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/DocTest.java @@ -57,6 +57,7 @@ import org.exist.storage.DBBroker; import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.ExistSAXParserFactory; +import org.exist.xmldb.EXistResourceSet; import org.exist.xquery.*; import org.exist.xquery.value.AnyURIValue; import org.exist.xquery.value.Sequence; @@ -77,7 +78,6 @@ import org.xmldb.api.base.Resource; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import org.xmlunit.builder.DiffBuilder; @@ -129,53 +129,57 @@ public void setUp() throws XMLDBException { @After public void tearDown() throws XMLDBException { + if (test != null) { + test.close(); + test = null; + } final CollectionManagementService cms = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); //Creates the 'test' collection cms.removeCollection("test"); - test = null; existEmbeddedServer.getRoot().removeResource(existEmbeddedServer.getRoot().getResource("test.xml")); } private void storeResource(final Collection col, final String fileName, final Class type, final String mimeType, final String content) throws XMLDBException { - Resource res = col.createResource(fileName, type); - res.setContent(content); - - if (mimeType != null) { - ((EXistResource) res).setMediaType(mimeType); - } - - col.storeResource(res); + try (final Resource res = col.createResource(fileName, type)) { + res.setContent(content); + + if (mimeType != null) { + ((EXistResource) res).setMediaType(mimeType); + } + + col.storeResource(res); + } } @Test public void testURIResolveWithEval() throws XMLDBException { String query = "util:eval(xs:anyURI('/db/test/test.xq'), false(), ())"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - - LocalXMLResource res = (LocalXMLResource)result.getResource(0); - assertNotNull(res); - Node n = res.getContentAsDOM(); - assertTrue(n instanceof Document); - assertEquals("y", ((Document) n).getDocumentElement().getLocalName()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + LocalXMLResource res = (LocalXMLResource) result.getResource(0); + assertNotNull(res); + Node n = res.getContentAsDOM(); + assertTrue(n instanceof Document); + assertEquals("y", ((Document) n).getDocumentElement().getLocalName()); + } query = "util:eval(xs:anyURI('/db/test/test1.xq'), false(), ())"; - result = existEmbeddedServer.executeQuery(query); - - res = (LocalXMLResource)result.getResource(0); - assertNotNull(res); - n = res.getContentAsDOM(); - assertTrue(n instanceof Document); - assertEquals("x", ((Document) n).getDocumentElement().getLocalName()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + XMLResource res = (LocalXMLResource) result.getResource(0); + assertNotNull(res); + Node n = res.getContentAsDOM(); + assertTrue(n instanceof Document); + assertEquals("x", ((Document) n).getDocumentElement().getLocalName()); + } query = "util:eval(xs:anyURI('/db/test/test2.xq'), false(), ())"; - result = existEmbeddedServer.executeQuery(query); - - res = (LocalXMLResource)result.getResource(0); - assertNotNull(res); - n = res.getContentAsDOM(); - assertTrue(n instanceof Document); - assertEquals("x", ((Document) n).getDocumentElement().getLocalName()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + XMLResource res = (LocalXMLResource) result.getResource(0); + assertNotNull(res); + Node n = res.getContentAsDOM(); + assertTrue(n instanceof Document); + assertEquals("x", ((Document) n).getDocumentElement().getLocalName()); + } } @Test diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/ExtDocTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/ExtDocTest.java index 35c4262598..6c93abf438 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/ExtDocTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/ExtDocTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -19,13 +43,13 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - package org.exist.xquery.functions.fn; import com.googlecode.junittoolbox.ParallelParameterized; import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.FileUtils; +import org.exist.xmldb.EXistResourceSet; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; @@ -34,7 +58,6 @@ import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import org.xmlunit.builder.DiffBuilder; @@ -97,29 +120,30 @@ public void removeExtDoc() { @Test public void parse() throws XMLDBException { final URI docUri = externalDoc.toUri(); - final ResourceSet result = existEmbeddedServer.executeQuery( + try (final EXistResourceSet result = existEmbeddedServer.executeQuery( "xquery version \"3.1\";\n" + "\n" + "declare namespace output = \"http://www.w3.org/2010/xslt-xquery-serialization\";" + "declare option output:omit-xml-declaration \"yes\";\n" + "\n" + "fn:doc('" + docUri + "')" - ); + )) { - assertNotNull(result); - assertEquals(1, result.getSize()); - final Resource resource = result.getResource(0); - assertNotNull(resource); - assertEquals(XML_RESOURCE, resource.getResourceType()); + assertNotNull(result); + assertEquals(1, result.getSize()); + final Resource resource = result.getResource(0); + assertNotNull(resource); + assertEquals(XML_RESOURCE, resource.getResourceType()); - final Source expectedSource = Input.fromString(docContent).build(); - final Source actualSource = Input.fromNode(((XMLResource)resource).getContentAsDOM()).build(); + final Source expectedSource = Input.fromString(docContent).build(); + final Source actualSource = Input.fromNode(((XMLResource) resource).getContentAsDOM()).build(); - final Diff diff = DiffBuilder.compare(expectedSource) + final Diff diff = DiffBuilder.compare(expectedSource) .withTest(actualSource) .checkForSimilar() .build(); - assertFalse(diff.toString(), diff.hasDifferences()); + assertFalse(diff.toString(), diff.hasDifferences()); + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/FunLangTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/FunLangTest.java index 30df2ff30c..239de85541 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/FunLangTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/FunLangTest.java @@ -47,12 +47,13 @@ import com.googlecode.junittoolbox.ParallelRunner; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; import static org.junit.Assert.assertEquals; import org.junit.runner.RunWith; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; /** @@ -79,9 +80,12 @@ public void testFnLangWithContext() throws XMLDBException { "" + "return " + "$doc-frag//desc[lang(\"en-US\")]"; - final ResourceSet resourceSet = existEmbeddedServer.executeQuery(query); - assertEquals(1, resourceSet.getSize()); - assertEquals("\n The first line of the description.\n", resourceSet.getResource(0).getContent()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("\n The first line of the description.\n", resource.getContent()); + } + } } @Test @@ -98,9 +102,12 @@ public void testFnLangWithArgument() throws XMLDBException { "" + "return " + "lang(\"en-US\", $doc-frag//desc[@n eq \"2\"])"; - final ResourceSet resourceSet = existEmbeddedServer.executeQuery(query); - assertEquals(1, resourceSet.getSize()); - assertEquals("false", resourceSet.getResource(0).getContent()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("false", resource.getContent()); + } + } } @Test @@ -117,8 +124,11 @@ public void testFnLangWithAttributeArgument() throws XMLDBException { "" + "return " + "lang(\"en-US\", $doc-frag//desc/@n[. eq \"1\"])"; - final ResourceSet resourceSet = existEmbeddedServer.executeQuery(query); - assertEquals(1, resourceSet.getSize()); - assertEquals("true", resourceSet.getResource(0).getContent()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("true", resource.getContent()); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/FunNumberTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/FunNumberTest.java index e055f0e232..cee14024d2 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/FunNumberTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/FunNumberTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,10 +46,11 @@ package org.exist.xquery.functions.fn; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; import static org.junit.Assert.assertEquals; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; /** @@ -39,7 +64,7 @@ public class FunNumberTest { @Test public void testFnNumberWithContext() throws XMLDBException { - final ResourceSet resourceSet = existEmbeddedServer.executeQuery( + try (final EXistResourceSet result = existEmbeddedServer.executeQuery( "let $errors := " + "" + "" + @@ -49,15 +74,18 @@ public void testFnNumberWithContext() throws XMLDBException { "" + "" + "return sum($errors//message/(@repeat/number(),1)[1])" - ); - - assertEquals(1, resourceSet.getSize()); - assertEquals("194", resourceSet.getResource(0).getContent()); + )) { + + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("194", resource.getContent()); + } + } } @Test public void testFnNumberWithArgument() throws XMLDBException { - final ResourceSet resourceSet = existEmbeddedServer.executeQuery( + try (final EXistResourceSet result = existEmbeddedServer.executeQuery( "let $errors := " + "" + "" + @@ -67,9 +95,12 @@ public void testFnNumberWithArgument() throws XMLDBException { "" + "" + "return sum($errors//message/(number(@repeat),1)[1])" - ); - - assertEquals(1, resourceSet.getSize()); - assertEquals("NaN", resourceSet.getResource(0).getContent()); + )) { + + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("NaN", resource.getContent()); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/FunStrLengthTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/FunStrLengthTest.java index 8f6af6ec50..fc4b2d6394 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/FunStrLengthTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/FunStrLengthTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,9 +46,10 @@ package org.exist.xquery.functions.fn; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XPathQueryService; @@ -39,31 +64,45 @@ public class FunStrLengthTest { public void contextItemWithinPredicate() throws XMLDBException { final XPathQueryService queryService = server.getRoot().getService(XPathQueryService.class); - ResourceSet results = null; - // upon empty sequence - results = queryService.query("()[fn:string-length(.) gt 0]"); - assertEquals(0, results.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) queryService.query("()[fn:string-length(.) gt 0]")) { + assertEquals(0, result.getSize()); + } - // upon computed empty sequence - results = queryService.query("fn:tokenize('', '/')[fn:string-length(.) gt 0]"); - assertEquals(0, results.getSize()); + // upon computed empty sequence + try (final EXistResourceSet result = (EXistResourceSet) queryService.query("fn:tokenize('', '/')[fn:string-length(.) gt 0]")) { + assertEquals(0, result.getSize()); + } // upon non-empty sequence - results = queryService.query("('a', '', 'bc', '', 'def')[fn:string-length(.) gt 0]"); - assertEquals(3, results.getSize()); - assertEquals("a", results.getResource(0).getContent()); - assertEquals("bc", results.getResource(1).getContent()); - assertEquals("def", results.getResource(2).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) queryService.query("('a', '', 'bc', '', 'def')[fn:string-length(.) gt 0]")) { + assertEquals(3, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("a", resource.getContent()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("bc", resource.getContent()); + } + try (final Resource resource = result.getResource(2)) { + assertEquals("def", resource.getContent()); + } + } // upon computed non-empty sequence - results = queryService.query("fn:tokenize('ab/c//def//g//', '/')[fn:string-length(.) gt 0]"); - assertEquals(4, results.getSize()); - assertEquals("ab", results.getResource(0).getContent()); - assertEquals("c", results.getResource(1).getContent()); - assertEquals("def", results.getResource(2).getContent()); - assertEquals("g", results.getResource(3).getContent()); + try (final EXistResourceSet result = (EXistResourceSet) queryService.query("fn:tokenize('ab/c//def//g//', '/')[fn:string-length(.) gt 0]")) { + assertEquals(4, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals("ab", resource.getContent()); + } + try (final Resource resource = result.getResource(1)) { + assertEquals("c", resource.getContent()); + } + try (final Resource resource = result.getResource(2)) { + assertEquals("def", resource.getContent()); + } + try (final Resource resource = result.getResource(3)) { + assertEquals("g", resource.getContent()); + } + } } - - } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/fn/FunSubSequenceTest.java b/exist-core/src/test/java/org/exist/xquery/functions/fn/FunSubSequenceTest.java index c53dd76c79..ae8ce927d2 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/fn/FunSubSequenceTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/fn/FunSubSequenceTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -19,12 +43,12 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - package org.exist.xquery.functions.fn; import com.googlecode.junittoolbox.ParallelRunner; import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.test.TestConstants; +import org.exist.xmldb.EXistResourceSet; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -32,7 +56,6 @@ import org.junit.runner.RunWith; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -51,161 +74,188 @@ public class FunSubSequenceTest { @Test public void all_arity2() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 1)"); - assertEquals("(1,2,3,4,5)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 1)")) { + assertEquals("(1,2,3,4,5)", asSequenceStr(result)); + } } @Test public void all_arity3() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 1, 5)"); - assertEquals("(1,2,3,4,5)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 1, 5)")) { + assertEquals("(1,2,3,4,5)", asSequenceStr(result)); + } } @Test public void firstItem_arity2() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1), 1)"); - assertEquals("(1)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1), 1)")) { + assertEquals("(1)", asSequenceStr(result)); + } } @Test public void firstItem_arity3() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 1, 1)"); - assertEquals("(1)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 1, 1)")) { + assertEquals("(1)", asSequenceStr(result)); + } } @Test public void midItem_arity3() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 2, 1)"); - assertEquals("(2)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 2, 1)")) { + assertEquals("(2)", asSequenceStr(result)); + } } @Test public void midItems_arity3() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 3, 2)"); - assertEquals("(3,4)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 3, 2)")) { + assertEquals("(3,4)", asSequenceStr(result)); + } } @Test public void lastItem_arity2() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 5)"); - assertEquals("(5)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 5)")) { + assertEquals("(5)", asSequenceStr(result)); + } } @Test public void lastItem_arity3() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 5, 1)"); - assertEquals("(5)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 5, 1)")) { + assertEquals("(5)", asSequenceStr(result)); + } } @Test public void allButFirst_arity2() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 2)"); - assertEquals("(2,3,4,5)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 2)")) { + assertEquals("(2,3,4,5)", asSequenceStr(result)); + } } @Test public void allButFirst_arity3() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 2, 4)"); - assertEquals("(2,3,4,5)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 2, 4)")) { + assertEquals("(2,3,4,5)", asSequenceStr(result)); + } } @Test public void allButLast_arity3() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 1, 4)"); - assertEquals("(1,2,3,4)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 1, 4)")) { + assertEquals("(1,2,3,4)", asSequenceStr(result)); + } } @Test public void outOfRange_arity2() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 7)"); - assertEquals("()", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 7)")) { + assertEquals("()", asSequenceStr(result)); + } } @Test public void outOfRange_arity3() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 7, 4)"); - assertEquals("()", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 7, 4)")) { + assertEquals("()", asSequenceStr(result)); + } } @Test public void zeroStartingLoc_arity2() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 0)"); - assertEquals("(1,2,3,4,5)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 0)")) { + assertEquals("(1,2,3,4,5)", asSequenceStr(result)); + } } @Test public void zeroStartingLocToMid_arity3() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 0, 3)"); - assertEquals("(1,2)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 0, 3)")) { + assertEquals("(1,2)", asSequenceStr(result)); + } } @Test public void zeroStartingLocToEnd_arity3() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 0, 5)"); - assertEquals("(1,2,3,4)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), 0, 5)")) { + assertEquals("(1,2,3,4)", asSequenceStr(result)); + } } @Test public void negativeStartingLoc_arity2() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), -2)"); - assertEquals("(1,2,3,4,5)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), -2)")) { + assertEquals("(1,2,3,4,5)", asSequenceStr(result)); + } } @Test public void negativeStartingLoc_arity3() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), -2, 5)"); - assertEquals("(1,2)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 5), -2, 5)")) { + assertEquals("(1,2)", asSequenceStr(result)); + } } @Test public void smallPartOfLargeRange_arity2() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 3000000000), 2999999995)"); - assertEquals("(2999999995,2999999996,2999999997,2999999998,2999999999,3000000000)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 3000000000), 2999999995)")) { + assertEquals("(2999999995,2999999996,2999999997,2999999998,2999999999,3000000000)", asSequenceStr(result)); + } } @Test public void smallPartOfLargeRange_arity3() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 3000000000), 2999999995, 5)"); - assertEquals("(2999999995,2999999996,2999999997,2999999998,2999999999)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence((1 to 3000000000), 2999999995, 5)")) { + assertEquals("(2999999995,2999999996,2999999997,2999999998,2999999999)", asSequenceStr(result)); + } } @Test public void largeRange_arity2() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:count(fn:subsequence((1 to 3000000000), -2147483649))"); - assertEquals("(3000000000)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:count(fn:subsequence((1 to 3000000000), -2147483649))")) { + assertEquals("(3000000000)", asSequenceStr(result)); + } } @Test public void largeRange_arity3() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:count(fn:subsequence((1 to 3000000000), 1, 3000000000))"); - assertEquals("(3000000000)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:count(fn:subsequence((1 to 3000000000), 1, 3000000000))")) { + assertEquals("(3000000000)", asSequenceStr(result)); + } } @Test public void persistentSupsequence_toInMemory() throws XMLDBException { - final ResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence(doc('" + TestConstants.TEST_COLLECTION_URI.getCollectionPath() + "/" + SIMPLE_XML_FILENAME + "')/nums/i, 2, 2)//text()"); - assertEquals("(2,3)", asSequenceStr(result)); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("fn:subsequence(doc('" + TestConstants.TEST_COLLECTION_URI.getCollectionPath() + "/" + SIMPLE_XML_FILENAME + "')/nums/i, 2, 2)//text()")) { + assertEquals("(2,3)", asSequenceStr(result)); + } } @BeforeClass public static void setup() throws XMLDBException { test = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), TestConstants.TEST_COLLECTION_URI.lastSegment().toString()); - final Resource resource = test.createResource(SIMPLE_XML_FILENAME, XMLResource.class); - resource.setContent(SIMPLE_XML); - test.storeResource(resource); + try (final Resource resource = test.createResource(SIMPLE_XML_FILENAME, XMLResource.class)) { + resource.setContent(SIMPLE_XML); + test.storeResource(resource); + } } @AfterClass public static void cleanup() throws XMLDBException { + test.close(); final CollectionManagementService collectionManagementService = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); collectionManagementService.removeCollection(test.getName()); } - private static String asSequenceStr(final ResourceSet result) throws XMLDBException { + private static String asSequenceStr(final EXistResourceSet result) throws XMLDBException { final StringBuilder builder = new StringBuilder(); builder.append('('); for (int i = 0; i < result.getSize(); i++) { - builder.append(result.getResource(i).getContent().toString()); + try (final Resource resource = result.getResource(i)) { + builder.append(resource.getContent().toString()); + } if (i + 1 < result.getSize()) { builder.append(','); } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/request/GetDataTest.java b/exist-core/src/test/java/org/exist/xquery/functions/request/GetDataTest.java index 0a42d2f076..0d6ef59fbf 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/request/GetDataTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/request/GetDataTest.java @@ -91,18 +91,24 @@ private static String wrapInElement(String value) { @BeforeClass public static void beforeClass() throws XMLDBException { root = DatabaseManager.getCollection("xmldb:exist://localhost:" + existWebServer.getPort() + "/xmlrpc/db", "admin", ""); - BinaryResource res = root.createResource(XQUERY_FILENAME, BinaryResource.class); - ((EXistResource) res).setMediaType(MediaType.APPLICATION_XQUERY); - res.setContent(XQUERY); - root.storeResource(res); - UserManagementService ums = root.getService(UserManagementService.class); - ums.chmod(res, 0777); + try (final BinaryResource res = root.createResource(XQUERY_FILENAME, BinaryResource.class)) { + ((EXistResource) res).setMediaType(MediaType.APPLICATION_XQUERY); + res.setContent(XQUERY); + root.storeResource(res); + UserManagementService ums = root.getService(UserManagementService.class); + ums.chmod(res, 0777); + } } @AfterClass public static void afterClass() throws XMLDBException { - BinaryResource res = (BinaryResource)root.getResource(XQUERY_FILENAME); - root.removeResource(res); + try (final BinaryResource res = (BinaryResource)root.getResource(XQUERY_FILENAME)) { + root.removeResource(res); + } + if (root != null) { + root.close(); + root = null; + } } @Test diff --git a/exist-core/src/test/java/org/exist/xquery/functions/request/GetParameterTest.java b/exist-core/src/test/java/org/exist/xquery/functions/request/GetParameterTest.java index 94c0b31d82..79f0536a4f 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/request/GetParameterTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/request/GetParameterTest.java @@ -94,18 +94,24 @@ public class GetParameterTest extends RESTTest { @BeforeClass public static void beforeClass() throws XMLDBException { root = DatabaseManager.getCollection("xmldb:exist://localhost:" + existWebServer.getPort() + "/xmlrpc/db", "admin", ""); - BinaryResource res = root.createResource(XQUERY_FILENAME, BinaryResource.class); - ((EXistResource) res).setMediaType(MediaType.APPLICATION_XQUERY); - res.setContent(XQUERY); - root.storeResource(res); - UserManagementService ums = root.getService(UserManagementService.class); - ums.chmod(res, 0777); + try (final BinaryResource res = root.createResource(XQUERY_FILENAME, BinaryResource.class)) { + ((EXistResource) res).setMediaType(MediaType.APPLICATION_XQUERY); + res.setContent(XQUERY); + root.storeResource(res); + UserManagementService ums = root.getService(UserManagementService.class); + ums.chmod(res, 0777); + } } @AfterClass public static void afterClass() throws XMLDBException { - BinaryResource res = (BinaryResource)root.getResource(XQUERY_FILENAME); - root.removeResource(res); + try (final BinaryResource res = (BinaryResource)root.getResource(XQUERY_FILENAME)) { + root.removeResource(res); + } + if (root != null) { + root.close(); + root = null; + } } @Test diff --git a/exist-core/src/test/java/org/exist/xquery/functions/request/PatchTest.java b/exist-core/src/test/java/org/exist/xquery/functions/request/PatchTest.java index 4ff213e0e4..40311ff703 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/request/PatchTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/request/PatchTest.java @@ -109,8 +109,23 @@ public static void beforeClass() throws XMLDBException { @AfterClass public static void afterClass() throws XMLDBException { - root.removeResource(bin); - root.removeResource(xml); + try { + root.removeResource(bin); + root.removeResource(xml); + } finally { + if (bin != null) { + bin.close(); + bin = null; + } + if (xml != null) { + xml.close(); + xml = null; + } + if (root != null) { + root.close(); + root = null; + } + } } @Test diff --git a/exist-core/src/test/java/org/exist/xquery/functions/system/GetRunningXQueriesTest.java b/exist-core/src/test/java/org/exist/xquery/functions/system/GetRunningXQueriesTest.java index 3e2be9177b..009f0eaffa 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/system/GetRunningXQueriesTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/system/GetRunningXQueriesTest.java @@ -46,9 +46,10 @@ package org.exist.xquery.functions.system; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import static org.hamcrest.MatcherAssert.assertThat; @@ -63,9 +64,12 @@ public class GetRunningXQueriesTest { @Test public void caller() throws XMLDBException { - final ResourceSet result = existXmldbEmbeddedServer.executeQuery("system:get-running-xqueries()"); - assertNotNull(result); - final String resultDoc = (String) result.getResource(0).getContent(); - assertThat(resultDoc, hasXPath("count(//@caller)", equalTo("1"))); + try (final EXistResourceSet result = existXmldbEmbeddedServer.executeQuery("system:get-running-xqueries()")) { + assertNotNull(result); + try (final Resource resource = result.getResource(0)) { + final String resultDoc = (String) resource.getContent(); + assertThat(resultDoc, hasXPath("count(//@caller)", equalTo("1"))); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformFromPkgTest.java b/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformFromPkgTest.java index b92e7af408..6f95db137b 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformFromPkgTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformFromPkgTest.java @@ -46,8 +46,8 @@ package org.exist.xquery.functions.transform; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import java.net.URISyntaxException; @@ -100,8 +100,9 @@ public void transformWithModuleFromPkg() throws XMLDBException { final String xquery = "transform:transform(" + xml + ", " + xslt + ", ())"; - final ResourceSet result = existXmldbEmbeddedServer.executeQuery(xquery); - assertNotNull(result); - assertEquals(1, result.getSize()); + try (final EXistResourceSet result = existXmldbEmbeddedServer.executeQuery(xquery)){ + assertNotNull(result); + assertEquals(1, result.getSize()); + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/util/Base64FunctionsTest.java b/exist-core/src/test/java/org/exist/xquery/functions/util/Base64FunctionsTest.java index 062b20cfe9..34ffb50057 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/util/Base64FunctionsTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/util/Base64FunctionsTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -25,16 +49,15 @@ import static org.junit.Assert.*; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; /** - * DOCUMENT ME! - * * @author Andrzej Taramina (andrzej@chaeron.com) */ public class Base64FunctionsTest { @@ -45,65 +68,88 @@ public class Base64FunctionsTest { @Test public void testBase64Encode() throws XMLDBException { final String query = "util:base64-encode( 'This is a test!' )"; - final ResourceSet result = existXmldbEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("VGhpcyBpcyBhIHRlc3Qh", r); + try (final EXistResourceSet result = existXmldbEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("VGhpcyBpcyBhIHRlc3Qh", r); + } + } } @Test public void testBase64EncodeWithTrim() throws XMLDBException { final String query = "util:base64-encode( 'This is a longer test to enforce an encoded string longer than the chunking limit!', true() )"; - final ResourceSet result = existXmldbEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("VGhpcyBpcyBhIGxvbmdlciB0ZXN0IHRvIGVuZm9yY2UgYW4gZW5jb2RlZCBzdHJpbmcgbG9uZ2VyIHRoYW4gdGhlIGNodW5raW5nIGxpbWl0IQ==", r); + try (final EXistResourceSet result = existXmldbEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("VGhpcyBpcyBhIGxvbmdlciB0ZXN0IHRvIGVuZm9yY2UgYW4gZW5jb2RlZCBzdHJpbmcgbG9uZ2VyIHRoYW4gdGhlIGNodW5raW5nIGxpbWl0IQ==", r); + } + } } @Test public void testBase64EncodeWithTrimFalse() throws XMLDBException { final String query = "util:base64-encode( 'This is a longer test to enforce an encoded string longer than the chunking limit!', false() )"; - final ResourceSet result = existXmldbEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("VGhpcyBpcyBhIGxvbmdlciB0ZXN0IHRvIGVuZm9yY2UgYW4gZW5jb2RlZCBzdHJpbmcgbG9uZ2VyIHRoYW4gdGhlIGNodW5raW5nIGxpbWl0IQ==", r); + try (final EXistResourceSet result = existXmldbEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("VGhpcyBpcyBhIGxvbmdlciB0ZXN0IHRvIGVuZm9yY2UgYW4gZW5jb2RlZCBzdHJpbmcgbG9uZ2VyIHRoYW4gdGhlIGNodW5raW5nIGxpbWl0IQ==", r); + } + } } @Test public void testBase64Decode() throws XMLDBException { final String query = "util:base64-decode( 'VGhpcyBpcyBhIHRlc3Qh' )"; - final ResourceSet result = existXmldbEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("This is a test!", r); + try (final EXistResourceSet result = existXmldbEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("This is a test!", r); + } + } } @Test public void testBase64EncodeDecode() throws XMLDBException { final String query = "util:base64-decode( util:base64-encode( 'This is a test!' ) )"; - final ResourceSet result = existXmldbEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("This is a test!", r); + try (final EXistResourceSet result = existXmldbEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("This is a test!", r); + } + } } @Test public void testBase64EncodeUrlSafeNoSpecial() throws XMLDBException { final String query = "util:base64-encode-url-safe( 'This is a test!' )"; - final ResourceSet result = existXmldbEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("VGhpcyBpcyBhIHRlc3Qh", r); + try (final EXistResourceSet result = existXmldbEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("VGhpcyBpcyBhIHRlc3Qh", r); + } + } } @Test public void testBase64EncodeUrlSafeSpecial() throws XMLDBException { final String query = "util:base64-encode-url-safe( '.ÿd' )"; - final ResourceSet result = existXmldbEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("LsO_ZA", r); + try (final EXistResourceSet result = existXmldbEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("LsO_ZA", r); + } + } } @Test public void testBase64DecodeUrlSafe() throws XMLDBException { final String query = "util:base64-decode( 'LsO_ZA' )"; - final ResourceSet result = existXmldbEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals(".ÿd", r); + try (final EXistResourceSet result = existXmldbEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals(".ÿd", r); + } + } } - } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/util/BaseConverterTest.java b/exist-core/src/test/java/org/exist/xquery/functions/util/BaseConverterTest.java index 063a699b97..6c23f62a07 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/util/BaseConverterTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/util/BaseConverterTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,12 +46,13 @@ package org.exist.xquery.functions.util; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; import static org.junit.Assert.*; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; /** @@ -41,25 +66,33 @@ public class BaseConverterTest { @Test public void testBaseConverterOctalToInt() throws XMLDBException { final String query = "util:base-to-integer(0755, 8)"; - final ResourceSet result = existXmldbEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("493", r); + try (final EXistResourceSet result = existXmldbEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("493", r); + } + } } @Test public void testBaseConverterIntToHex() throws XMLDBException { final String query = "util:integer-to-base(10, 16)"; - final ResourceSet result = existXmldbEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("a", r); + try (final EXistResourceSet result = existXmldbEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("a", r); + } + } } @Test public void testBaseConverterIntToBinary() throws XMLDBException { final String query = "util:integer-to-base(4, 2)"; - final ResourceSet result = existXmldbEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("100", r); + try (final EXistResourceSet result = existXmldbEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("100", r); + } + } } - } \ No newline at end of file diff --git a/exist-core/src/test/java/org/exist/xquery/functions/util/EvalTest.java b/exist-core/src/test/java/org/exist/xquery/functions/util/EvalTest.java index 5f53d05231..377670ed79 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/util/EvalTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/util/EvalTest.java @@ -58,7 +58,6 @@ import org.xmldb.api.base.Collection; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; @@ -99,21 +98,25 @@ public void eval() throws XPathException, XMLDBException { final String query = "let $query := 'let $a := 1 return $a'\n" + "return\n" + "util:eval($query)"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("1", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("1", r); + } + } } @Test public void evalWithExternalVars() throws XPathException, XMLDBException { final String query = "let $value := 'world' return\n" + "\tutil:eval(xs:anyURI('/db/" + INVOKABLE_QUERY_FILENAME + "'), false(), (xs:QName('" + INVOKABLE_QUERY_EXTERNAL_VAR_NAME + "'), $value))"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { - final LocalXMLResource res = (LocalXMLResource)result.getResource(0); - final Node n = res.getContentAsDOM(); - assertEquals(n.getLocalName(), "hello"); - assertEquals("world", n.getFirstChild().getNodeValue()); + final LocalXMLResource res = (LocalXMLResource) result.getResource(0); + final Node n = res.getContentAsDOM(); + assertEquals(n.getLocalName(), "hello"); + assertEquals("world", n.getFirstChild().getNodeValue()); + } } @Test @@ -121,9 +124,12 @@ public void evalwithPI() throws XPathException, XMLDBException { final String query = "let $query := 'let $a := return count($a//processing-instruction())'\n" + "return\n" + "util:eval($query)"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("1", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("1", r); + } + } } @Test @@ -132,9 +138,12 @@ public void evalInline() throws XPathException, XMLDBException { "let $query := 'count(.//*)'\n" + "return\n" + "util:eval-inline($xml,$query)"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("3", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("3", r); + } + } } @Test @@ -146,9 +155,12 @@ public void testEvalWithContextVariable() throws XPathException, XMLDBException "let $query := 'count($xml//*) mod 2 = 0'\n" + "return\n" + "util:eval-with-context($query, $context, false())"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("true", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("true", r); + } + } } @Test @@ -160,9 +172,12 @@ public void testEvalSupplyingContext() throws XPathException, XMLDBException { "let $query := 'count(.//*) mod 2 = 0'\n" + "return\n" + "util:eval-with-context($query, $context, false())"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("true", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("true", r); + } + } } @Test @@ -175,20 +190,26 @@ public void testEvalSupplyingContextAndVariable() throws XPathException, XMLDBEx "let $query := 'count($xml//*) + count(.//*)'\n" + "return\n" + "util:eval-with-context($query, $context, false())"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("3", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("3", r); + } + } } - + @Test public void testEvalSupplyingContextItem() throws XPathException, XMLDBException { final String query = "let $context := 'London'\n" + "let $query := '.'\n" + "return\n" + "util:eval-with-context($query, (), false(), $context)"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("London", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("London", r); + } + } } @Test @@ -200,7 +221,10 @@ public void evalInContextWithPreDeclaredNamespace() throws XMLDBException { "import module namespace util = \"http://exist-db.org/xquery/util\";\r\n" + "let $q := \"/db:article\" return\r\n" + "util:eval($q)"; - existEmbeddedServer.executeQuery(query); + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + // needed to ensure that result is closed + } } @Test @@ -215,31 +239,36 @@ public void evalInContextWithPreDeclaredNamespaceAcrossLocalFunctionBoundary() t "};\r\n" + "let $q := \"/db:article\" return\r\n" + "local:process($q)"; - existEmbeddedServer.executeQuery(query); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + // needed to ensure that result is closed + } } //should fail with - Error while evaluating expression: /db:article. XPST0081: No namespace defined for prefix db [at line 5, column 9] @Test(expected=XMLDBException.class) public void evalInContextWithPreDeclaredNamespaceAcrossModuleBoundary() throws XMLDBException { - Collection testHome = createCollection("testEvalInContextWithPreDeclaredNamespace"); - final String processorModule = + try (final Collection testHome = createCollection("testEvalInContextWithPreDeclaredNamespace")) { + final String processorModule = "xquery version \"1.0\";\r\n" + - "module namespace processor = \"http://processor\";\r\n" + - "import module namespace util = \"http://exist-db.org/xquery/util\";\r\n" + - "declare function processor:process($q as xs:string) {\r\n" + - "\tutil:eval($q)\r\n" + - "};"; - - writeModule(testHome, "processor.xqm", processorModule); - - final String query = - "xquery version \"1.0\";\r\n" + - "import module namespace processor = \"http://processor\" at \"xmldb:exist://" + testHome.getName() + "/processor.xqm\";\r\n" + - "declare namespace db = \"http://docbook.org/ns/docbook\";\r\n" + - "let $q := \"/db:article\" return\r\n" + - "processor:process($q)"; + "module namespace processor = \"http://processor\";\r\n" + + "import module namespace util = \"http://exist-db.org/xquery/util\";\r\n" + + "declare function processor:process($q as xs:string) {\r\n" + + "\tutil:eval($q)\r\n" + + "};"; + + writeModule(testHome, "processor.xqm", processorModule); - existEmbeddedServer.executeQuery(query); + final String query = + "xquery version \"1.0\";\r\n" + + "import module namespace processor = \"http://processor\" at \"xmldb:exist://" + testHome.getName() + "/processor.xqm\";\r\n" + + "declare namespace db = \"http://docbook.org/ns/docbook\";\r\n" + + "let $q := \"/db:article\" return\r\n" + + "processor:process($q)"; + + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + // needed to ensure that result is closed + } + } } /** @@ -252,44 +281,45 @@ public void evalInContextWithPreDeclaredNamespaceAcrossModuleBoundary() throws X @Test public void evalWithMissingVariableReferenceShouldReportTheSameErrorEachTime() throws XMLDBException { final String testHomeName = "testEvalWithMissingVariableReferenceShouldReportTheSameErrorEachTime"; - final Collection testHome = createCollection(testHomeName); - - final String configModuleName = "config-test.xqm"; - final String configModule = "xquery version \"1.0\";\r\n" + - "module namespace ct = \"http://config/test\";\r\n" + - "declare variable $ct:var1 := request:get-parameter(\"var1\", ());"; - - writeModule(testHome, configModuleName, configModule); - - final String testModuleName = "test.xqy"; - final String testModule = "import module namespace ct = \"http://config/test\" at \"xmldb:exist:///db/" + testHomeName + "/" + configModuleName + "\";\r\n" + - "declare namespace x = \"http://x\";\r\n" + - "declare function local:hello() {\r\n" + - " (\r\n" + - "hello,\r\n" + - "util:eval(\"$ct:var1\")\r\n" + - ")\r\n" + - "};\r\n" + - "local:hello()"; - - writeModule(testHome, testModuleName, testModule); - - //run the 1st time - try { - executeModule(testHome, testModuleName); - } catch(final XMLDBException e) { - final Throwable cause = e.getCause(); - assertTrue(cause instanceof XPathException); - assertEquals(ErrorCodes.XPDY0002, ((XPathException) cause).getErrorCode()); - } - - //run a 2nd time, error code should be the same! - try { - executeModule(testHome, testModuleName); - } catch(final XMLDBException e) { - final Throwable cause = e.getCause(); - assertTrue(cause instanceof XPathException); - assertEquals(ErrorCodes.XPDY0002, ((XPathException)cause).getErrorCode()); + try (final Collection testHome = createCollection(testHomeName)) { + + final String configModuleName = "config-test.xqm"; + final String configModule = "xquery version \"1.0\";\r\n" + + "module namespace ct = \"http://config/test\";\r\n" + + "declare variable $ct:var1 := request:get-parameter(\"var1\", ());"; + + writeModule(testHome, configModuleName, configModule); + + final String testModuleName = "test.xqy"; + final String testModule = "import module namespace ct = \"http://config/test\" at \"xmldb:exist:///db/" + testHomeName + "/" + configModuleName + "\";\r\n" + + "declare namespace x = \"http://x\";\r\n" + + "declare function local:hello() {\r\n" + + " (\r\n" + + "hello,\r\n" + + "util:eval(\"$ct:var1\")\r\n" + + ")\r\n" + + "};\r\n" + + "local:hello()"; + + writeModule(testHome, testModuleName, testModule); + + //run the 1st time + try (final EXistResourceSet result = executeModule(testHome, testModuleName)) { + // needed to ensure that result is closed + } catch (final XMLDBException e) { + final Throwable cause = e.getCause(); + assertTrue(cause instanceof XPathException); + assertEquals(ErrorCodes.XPDY0002, ((XPathException) cause).getErrorCode()); + } + + //run a 2nd time, error code should be the same! + try (final EXistResourceSet result = executeModule(testHome, testModuleName)) { + // needed to ensure that result is closed + } catch (final XMLDBException e) { + final Throwable cause = e.getCause(); + assertTrue(cause instanceof XPathException); + assertEquals(ErrorCodes.XPDY0002, ((XPathException) cause).getErrorCode()); + } } } @@ -297,7 +327,7 @@ private Collection createCollection(String collectionName) throws XMLDBException Collection collection = existEmbeddedServer.getRoot().getChildCollection(collectionName); if (collection == null) { CollectionManagementService cmService = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); - cmService.createCollection(collectionName); + try (final Collection created = cmService.createCollection(collectionName)) { } } collection = DatabaseManager.getCollection(XmldbURI.LOCAL_DB + "/" + collectionName, "admin", ""); @@ -310,9 +340,10 @@ public void evalAndSerialize() throws XMLDBException { final String query = "let $query := \"hello\"\n" + "return\n" + "util:eval-and-serialize($query, ())"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final Resource r = result.getResource(0); - assertEquals("hello", r.getContent()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final Resource r = result.getResource(0); + assertEquals("hello", r.getContent()); + } } @Test @@ -320,9 +351,10 @@ public void evalAndSerializeDefaultOptions() throws XMLDBException { String query = "let $query := \"hello\"\n" + "return\n" + "util:eval-and-serialize($query, map { \"method\": \"adaptive\" })"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - Resource r = result.getResource(0); - assertEquals("hello", r.getContent()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final Resource r = result.getResource(0); + assertEquals("hello", r.getContent()); + } // test that XQuery Prolog output options override the default provided options query = "xquery version \"3.1\";\n" + @@ -331,9 +363,10 @@ public void evalAndSerializeDefaultOptions() throws XMLDBException { "let $query := \"hello\"\n" + "return\n" + "util:eval-and-serialize($query, map { \"method\": \"adaptive\" })"; - result = existEmbeddedServer.executeQuery(query); - r = result.getResource(0); - assertEquals("hello", r.getContent()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final Resource r = result.getResource(0); + assertEquals("hello", r.getContent()); + } } @Test @@ -341,9 +374,10 @@ public void evalAndSerializeJson() throws XMLDBException { String query = "let $query := \"hello\"\n" + "return\n" + "util:eval-and-serialize($query, map { \"method\": \"json\" })"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - Resource r = result.getResource(0); - assertEquals("{\"elem1\":\"hello\"}", r.getContent()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final Resource r = result.getResource(0); + assertEquals("{\"elem1\":\"hello\"}", r.getContent()); + } } @Test @@ -351,9 +385,10 @@ public void evalAndSerializeAdaptive() throws XMLDBException { String query = "let $query := 'map { \"key\": \"value\"}'\n" + "return\n" + "util:eval-and-serialize($query, map { \"method\": \"adaptive\" })"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - Resource r = result.getResource(0); - assertEquals("map{\"key\":\"value\"}", r.getContent()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final Resource r = result.getResource(0); + assertEquals("map{\"key\":\"value\"}", r.getContent()); + } } @Test @@ -361,9 +396,10 @@ public void evalAndSerializeSubsequence() throws XMLDBException { final String query = "let $query := \"for $i in (1 to 10) return {$i}\"\n" + "return\n" + "util:eval-and-serialize($query, (), 1, 4)"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final Resource r = result.getResource(0); - assertEquals("1234", r.getContent()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final Resource r = result.getResource(0); + assertEquals("1234", r.getContent()); + } } @Test @@ -374,8 +410,7 @@ public void evalErrorInfo() { " fn:error($code, $msg)\"\n" + "return\n" + " util:eval($query, false(), (), false())"; - try { - existEmbeddedServer.executeQuery(query); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { fail("Expected XPathException"); @@ -393,8 +428,7 @@ public void evalPassErrorInfo() { " fn:error($code, $msg)\"\n" + "return\n" + " util:eval($query, false(), (), true())"; - try { - existEmbeddedServer.executeQuery(query); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { fail("Expected XPathException"); @@ -405,14 +439,14 @@ public void evalPassErrorInfo() { } private void writeModule(Collection collection, String modulename, String module) throws XMLDBException { - BinaryResource res = collection.createResource(modulename, BinaryResource.class); - ((EXistResource) res).setMediaType(MediaType.APPLICATION_XQUERY); - res.setContent(module.getBytes()); - collection.storeResource(res); - collection.close(); + try (final BinaryResource res = collection.createResource(modulename, BinaryResource.class)) { + ((EXistResource) res).setMediaType(MediaType.APPLICATION_XQUERY); + res.setContent(module.getBytes()); + collection.storeResource(res); + } } - private ResourceSet executeModule(final Collection collection, final String moduleName) throws XMLDBException { + private EXistResourceSet executeModule(final Collection collection, final String moduleName) throws XMLDBException { final EXistXPathQueryService service = collection.getService(EXistXPathQueryService.class); final XmldbURI moduleUri = ((EXistCollection)collection).getPathURI().append(moduleName); return service.executeStoredQuery(moduleUri.toString()); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/util/ExpandTest.java b/exist-core/src/test/java/org/exist/xquery/functions/util/ExpandTest.java index 3967ff4b77..7c2fddde85 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/util/ExpandTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/util/ExpandTest.java @@ -50,11 +50,14 @@ import static org.xmldb.api.base.ResourceType.XML_RESOURCE; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; import org.w3c.dom.Node; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; /** @@ -73,11 +76,12 @@ public class ExpandTest { @BeforeClass public static void setup() throws XMLDBException { - final Collection expandTestCol = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "expand-test"); - existEmbeddedServer.storeResource(expandTestCol, "doc1.xml", DOC1_CONTENT.getBytes(UTF_8)); - existEmbeddedServer.storeResource(expandTestCol, "doc2.xml", DOC2_CONTENT.getBytes(UTF_8)); - existEmbeddedServer.storeResource(expandTestCol, "doc3.xml", DOC3_CONTENT.getBytes(UTF_8)); - existEmbeddedServer.storeResource(expandTestCol, "doc4.xml", DOC4_CONTENT.getBytes(UTF_8)); + try (final Collection expandTestCol = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "expand-test")) { + existEmbeddedServer.storeResource(expandTestCol, "doc1.xml", DOC1_CONTENT.getBytes(UTF_8)); + existEmbeddedServer.storeResource(expandTestCol, "doc2.xml", DOC2_CONTENT.getBytes(UTF_8)); + existEmbeddedServer.storeResource(expandTestCol, "doc3.xml", DOC3_CONTENT.getBytes(UTF_8)); + existEmbeddedServer.storeResource(expandTestCol, "doc4.xml", DOC4_CONTENT.getBytes(UTF_8)); + } } @Test @@ -91,9 +95,12 @@ public void expandWithDefaultNS() throws XMLDBException { "\n" + "{util:expand($doc)}\n" + ""; - ResourceSet result = existEmbeddedServer.executeQuery(query); - String r = (String) result.getResource(0).getContent(); - assertEquals(expected, r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals(expected, r); + } + } query = "" + "let $doc-path := xmldb:store('/db', 'test.xml', )\n" + @@ -102,53 +109,64 @@ public void expandWithDefaultNS() throws XMLDBException { "\n" + "{$doc}\n" + ""; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals(expected, r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals(expected, r); + } + } } @Test public void expandPersistentDom() throws XMLDBException { final String query = "util:expand(doc('/db/expand-test/doc1.xml'))"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals(DOC1_CONTENT, r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals(DOC1_CONTENT, r); + } + } } @Test public void expandPersistentDomCommentsFirst() throws XMLDBException { final String query = "util:expand(doc('/db/expand-test/doc2.xml'))"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals(DOC2_CONTENT, r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals(DOC2_CONTENT, r); + } + } } @Test public void expandPersistentDomAttr() throws XMLDBException { final String query = "util:expand(doc('/db/expand-test/doc3.xml')/doc3/@foo)"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final Resource res = result.getResource(0); - assertEquals(XML_RESOURCE, res.getResourceType()); - final XMLResource xmlRes = (XMLResource) res; - final Node node = xmlRes.getContentAsDOM(); - assertEquals(Node.ATTRIBUTE_NODE, node.getNodeType()); - assertNull(node.getNamespaceURI()); - assertEquals("foo", node.getNodeName()); - assertEquals("bar", node.getNodeValue()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final Resource res = result.getResource(0); + assertEquals(XML_RESOURCE, res.getResourceType()); + final XMLResource xmlRes = (XMLResource) res; + final Node node = xmlRes.getContentAsDOM(); + assertEquals(Node.ATTRIBUTE_NODE, node.getNodeType()); + assertNull(node.getNamespaceURI()); + assertEquals("foo", node.getNodeName()); + assertEquals("bar", node.getNodeValue()); + } } @Test public void expandPersistentDomAttrNs() throws XMLDBException { final String query = "declare namespace x = \"http://x\";\n" + "util:expand(doc('/db/expand-test/doc4.xml')/doc4/@x:foo)"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final Resource res = result.getResource(0); - assertEquals(XML_RESOURCE, res.getResourceType()); - final XMLResource xmlRes = (XMLResource) res; - final Node node = xmlRes.getContentAsDOM(); - assertEquals(Node.ATTRIBUTE_NODE, node.getNodeType()); - assertEquals("http://x", node.getNamespaceURI()); - assertEquals("foo", node.getNodeName()); - assertEquals("bar", node.getNodeValue()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final Resource res = result.getResource(0); + assertEquals(XML_RESOURCE, res.getResourceType()); + final XMLResource xmlRes = (XMLResource) res; + final Node node = xmlRes.getContentAsDOM(); + assertEquals(Node.ATTRIBUTE_NODE, node.getNodeType()); + assertEquals("http://x", node.getNamespaceURI()); + assertEquals("foo", node.getNodeName()); + assertEquals("bar", node.getNodeValue()); + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/validate/AdditionalJingXsdRngTest.java b/exist-core/src/test/java/org/exist/xquery/functions/validate/AdditionalJingXsdRngTest.java index 985ac4b6c6..e2e4edab8f 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/validate/AdditionalJingXsdRngTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/validate/AdditionalJingXsdRngTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,14 +46,13 @@ package org.exist.xquery.functions.validate; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; -import static org.junit.Assert.*; - -import org.exist.xquery.XPathException; - -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; +import static org.junit.Assert.*; + /** * Additional tests for the validation:jing() function with RNGs and XSDs * @@ -64,9 +87,12 @@ public void testValidateXSDwithJing() throws XMLDBException { "\n" + "\tvalidation:jing($v,$schema)"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("true", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("true", r); + } + } } @Test @@ -92,13 +118,16 @@ public void testValidateXSDwithJing_invalid() throws XMLDBException { "\n" + "\tvalidation:jing($v,$schema)"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("false", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("false", r); + } + } } @Test - public void testValidateRNGwithJing() throws XPathException, XMLDBException { + public void testValidateRNGwithJing() throws XMLDBException { final String query = "let $v := \n" + "\tTitle\n" + "\t

          Some paragraph.

          \n" + @@ -132,9 +161,12 @@ public void testValidateRNGwithJing() throws XPathException, XMLDBException { "\n" + "\tvalidation:jing($v,$schema)"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("true", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("true", r); + } + } } @Test @@ -172,14 +204,17 @@ public void testValidateRNGwithJing_invalid() throws XMLDBException { "\n" + "\tvalidation:jing($v,$schema)"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - final String r = (String) result.getResource(0).getContent(); - assertEquals("false", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("false", r); + } + } } @Test @Ignore("Looks good, but memory issue") - public void repeatTests() throws XMLDBException, XPathException { + public void repeatTests() throws XMLDBException { for (int i = 0; i < 1000; i++) { testValidateRNGwithJing(); testValidateRNGwithJing_invalid(); diff --git a/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxpDtdCatalogTest.java b/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxpDtdCatalogTest.java index b863933b78..b2e03739a4 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxpDtdCatalogTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxpDtdCatalogTest.java @@ -47,6 +47,7 @@ import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.io.InputStreamUtil; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; import static org.exist.collections.CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE; @@ -60,7 +61,7 @@ import java.io.InputStream; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; /** @@ -82,11 +83,11 @@ public class JaxpDtdCatalogTest { public static void prepareResources() throws XMLDBException, IOException { // Switch off validation - try (Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/parse")) { + try (final Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/parse")) { existEmbeddedServer.storeResource(conf, DEFAULT_COLLECTION_CONFIG_FILE, noValidation.getBytes()); } - try (Collection dtdsCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse/dtds")) { + try (final Collection dtdsCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse/dtds")) { try (final InputStream is = SAMPLES.getSample("validation/parse/dtds/MyNameSpace.dtd")) { assertNotNull(is); @@ -94,7 +95,7 @@ public static void prepareResources() throws XMLDBException, IOException { } } - try (Collection parseCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse")) { + try (final Collection parseCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse")) { try (final InputStream is = SAMPLES.getSample("validation/parse/catalog.xml")) { assertNotNull(is); @@ -102,7 +103,7 @@ public static void prepareResources() throws XMLDBException, IOException { } } - try (Collection instanceCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse/instance")) { + try (final Collection instanceCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse/instance")) { try (final InputStream is = SAMPLES.getSample("validation/parse/instance/valid-dtd.xml")) { assertNotNull(is); @@ -118,8 +119,11 @@ public static void prepareResources() throws XMLDBException, IOException { @Before public void clearGrammarCache() throws XMLDBException { - final ResourceSet results = existEmbeddedServer.executeQuery("validation:clear-grammar-cache()"); - results.getResource(0).getContent(); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("validation:clear-grammar-cache()")) { + try (final Resource resource = result.getResource(0)) { + resource.getContent(); + } + } } /* @@ -180,10 +184,13 @@ public void dtd_searched_invalid() throws XMLDBException { } private void executeAndEvaluate(final String query, final String expectedValue) throws XMLDBException { - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); - final String result = (String) results.getResource(0).getContent(); - assertThat(result, hasXPath("//status/text()", equalTo(expectedValue))); + try (final Resource resource = result.getResource(0)) { + final String content = (String) resource.getContent(); + assertThat(content, hasXPath("//status/text()", equalTo(expectedValue))); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxpParseTest.java b/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxpParseTest.java index c5d7d635bc..73d1fe0868 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxpParseTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxpParseTest.java @@ -47,6 +47,7 @@ import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.io.InputStreamUtil; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; import static org.exist.collections.CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE; @@ -59,7 +60,7 @@ import org.xml.sax.SAXException; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmlunit.matchers.CompareMatcher; @@ -84,11 +85,11 @@ public class JaxpParseTest { public static void prepareResources() throws Exception { // Switch off validation - try (Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/parse_validate")) { + try (final Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/parse_validate")) { existEmbeddedServer.storeResource(conf, DEFAULT_COLLECTION_CONFIG_FILE, noValidation.getBytes()); } - try (Collection schemasCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse_validate")) { + try (final Collection schemasCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse_validate")) { for (final String testResource : TEST_RESOURCES) { try (final InputStream is = SAMPLES.getSample("validation/parse_validate/" + testResource)) { @@ -102,8 +103,11 @@ public static void prepareResources() throws Exception { @Before public void clearGrammarCache() throws XMLDBException { - final ResourceSet results = existEmbeddedServer.executeQuery("validation:clear-grammar-cache()"); - results.getResource(0).getContent(); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("validation:clear-grammar-cache()")) { + try (final Resource resource = result.getResource(0)) { + resource.getContent(); + } + } } @Test @@ -124,8 +128,11 @@ public void parse_and_fill_defaults() throws XMLDBException, IOException, SAXExc } private String execute(final String query) throws XMLDBException { - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); - return (String) results.getResource(0).getContent(); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + return (String) resource.getContent(); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxpXsdCatalogTest.java b/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxpXsdCatalogTest.java index e9f3486cdd..47e1645f80 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxpXsdCatalogTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxpXsdCatalogTest.java @@ -47,6 +47,7 @@ import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.io.InputStreamUtil; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; import static org.exist.collections.CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE; @@ -60,7 +61,7 @@ import java.io.InputStream; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; /** @@ -82,11 +83,11 @@ public class JaxpXsdCatalogTest { public static void prepareResources() throws XMLDBException, IOException { // Switch off validation - try (Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/parse")) { + try (final Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/parse")) { existEmbeddedServer.storeResource(conf, DEFAULT_COLLECTION_CONFIG_FILE, noValidation.getBytes()); } - try (Collection schemasCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse/schemas")) { + try (final Collection schemasCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse/schemas")) { try (final InputStream is = SAMPLES.getSample("validation/parse/schemas/MyNameSpace.xsd")) { assertNotNull(is); @@ -100,14 +101,14 @@ public static void prepareResources() throws XMLDBException, IOException { } - try (Collection parseCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse")) { + try (final Collection parseCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse")) { try (final InputStream is = SAMPLES.getSample("validation/parse/catalog.xml")) { assertNotNull(is); existEmbeddedServer.storeResource(parseCollection, "catalog.xml", InputStreamUtil.readAll(is)); } } - try (Collection instanceCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse/instance")) { + try (final Collection instanceCollection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "parse/instance")) { try (final InputStream is = SAMPLES.getSample("validation/parse/instance/valid.xml")) { assertNotNull(is); @@ -123,8 +124,11 @@ public static void prepareResources() throws XMLDBException, IOException { @Before public void clearGrammarCache() throws XMLDBException { - final ResourceSet results = existEmbeddedServer.executeQuery("validation:clear-grammar-cache()"); - results.getResource(0).getContent(); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery("validation:clear-grammar-cache()")) { + try (final Resource resource = result.getResource(0)) { + resource.getContent(); + } + } } @Test @@ -214,9 +218,12 @@ public void xsd_searched_parse_invalid() throws XMLDBException { } private void executeAndEvaluate(final String query, final String expectedValue) throws XMLDBException { - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); - final String result = (String) results.getResource(0).getContent(); - assertThat(result, hasXPath("//status/text()", equalTo(expectedValue))); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + final String content = (String) resource.getContent(); + assertThat(content, hasXPath("//status/text()", equalTo(expectedValue))); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxvTest.java b/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxvTest.java index 3b886e8678..9bec703a88 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxvTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/validate/JaxvTest.java @@ -50,6 +50,7 @@ import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.io.InputStreamUtil; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; import static org.exist.collections.CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE; @@ -61,7 +62,7 @@ import static org.xmlunit.matchers.EvaluateXPathMatcher.hasXPath; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; /** @@ -84,11 +85,11 @@ public static void prepareResources() throws XMLDBException, IOException { "" + ""; - try (Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/personal")) { + try (final Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/personal")) { existEmbeddedServer.storeResource(conf, DEFAULT_COLLECTION_CONFIG_FILE, noValidation.getBytes()); } - try (Collection collection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "personal")) { + try (final Collection collection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "personal")) { for (final String testResource : TEST_RESOURCES) { try (final InputStream is = SAMPLES.getSample("validation/personal/" + testResource)) { @@ -105,10 +106,13 @@ public void xsd_stored_valid() throws XMLDBException { "doc('/db/personal/personal-valid.xml'), " + "doc('/db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); - assertEquals(query, "true", - results.getResource(0).getContent().toString()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "true", + resource.getContent().toString()); + } + } } @Test @@ -117,10 +121,13 @@ public void xsd_stored_invalid() throws XMLDBException { "doc('/db/personal/personal-invalid.xml'), " + "doc('/db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); - assertEquals(query, "false", - results.getResource(0).getContent().toString()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "false", + resource.getContent().toString()); + } + } } @Test @@ -129,11 +136,14 @@ public void xsd_stored_report_valid() throws XMLDBException { "doc('/db/personal/personal-valid.xml'), " + "doc('/db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); - final String result = (String) results.getResource(0).getContent(); - assertThat(result, hasXPath("//status/text()", equalTo("valid"))); + try (final Resource resource = result.getResource(0)) { + final String content = (String) resource.getContent(); + assertThat(content, hasXPath("//status/text()", equalTo("valid"))); + } + } } @Test @@ -142,11 +152,14 @@ public void xsd_stored_report_invalid() throws XMLDBException { "doc('/db/personal/personal-invalid.xml'), " + "doc('/db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); - final String result = (String) results.getResource(0).getContent(); - assertThat(result, hasXPath("//status/text()", equalTo("invalid"))); + try (final Resource resource = result.getResource(0)) { + final String content = (String) resource.getContent(); + assertThat(content, hasXPath("//status/text()", equalTo("invalid"))); + } + } } @Test @@ -155,10 +168,13 @@ public void xsd_anyuri_valid() throws XMLDBException { "xs:anyURI('xmldb:exist:///db/personal/personal-valid.xml'), " + "xs:anyURI('xmldb:exist:///db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); - assertEquals(query, "true", - results.getResource(0).getContent().toString()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "true", + resource.getContent().toString()); + } + } } @Test @@ -167,10 +183,13 @@ public void xsd_anyuri_invalid() throws XMLDBException { "xs:anyURI('xmldb:exist:///db/personal/personal-invalid.xml'), " + "xs:anyURI('xmldb:exist:///db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); - assertEquals(query, "false", - results.getResource(0).getContent().toString()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "false", + resource.getContent().toString()); + } + } } @Test @@ -179,11 +198,14 @@ public void xsd_anyuri_report_valid() throws XMLDBException { "xs:anyURI('xmldb:exist:///db/personal/personal-valid.xml'), " + "xs:anyURI('xmldb:exist:///db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); - final String result = (String) results.getResource(0).getContent(); - assertThat(result, hasXPath("//status/text()", equalTo("valid"))); + try (final Resource resource = result.getResource(0)) { + final String content = (String) resource.getContent(); + assertThat(content, hasXPath("//status/text()", equalTo("valid"))); + } + } } @Test @@ -192,11 +214,14 @@ public void xsd_anyuri_report_invalid() throws XMLDBException { "xs:anyURI('xmldb:exist:///db/personal/personal-invalid.xml'), " + "xs:anyURI('xmldb:exist:///db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); - final String result = (String) results.getResource(0).getContent(); - assertThat(result, hasXPath("//status/text()", equalTo("invalid"))); + try (final Resource resource = result.getResource(0)) { + final String content = (String) resource.getContent(); + assertThat(content, hasXPath("//status/text()", equalTo("invalid"))); + } + } } @Test @@ -205,10 +230,13 @@ public void xsd_stored_anyuri_valid() throws XMLDBException { "doc('/db/personal/personal-valid.xml'), " + "xs:anyURI('xmldb:exist:///db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); - assertEquals(query, "true", - results.getResource(0).getContent().toString()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "true", + resource.getContent().toString()); + } + } } @Test @@ -217,10 +245,13 @@ public void xsd_stored_anyuri_invalid() throws XMLDBException { "doc('/db/personal/personal-invalid.xml'), " + "xs:anyURI('xmldb:exist:///db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); - assertEquals(query, "false", - results.getResource(0).getContent().toString()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "false", + resource.getContent().toString()); + } + } } @Test @@ -229,11 +260,14 @@ public void xsd_stored_anyuri_report_valid() throws XMLDBException { "doc('/db/personal/personal-valid.xml'), " + "xs:anyURI('xmldb:exist:///db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); - final String r = (String) results.getResource(0).getContent(); - assertThat(r, hasXPath("//status/text()", equalTo("valid"))); + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertThat(r, hasXPath("//status/text()", equalTo("valid"))); + } + } } @Test @@ -242,11 +276,14 @@ public void xsd_stored_anyuri_report_invalid() throws XMLDBException { "doc('/db/personal/personal-invalid.xml'), " + "xs:anyURI('xmldb:exist:///db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); - final String r = (String) results.getResource(0).getContent(); - assertThat(r, hasXPath("//status/text()", equalTo("invalid"))); + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertThat(r, hasXPath("//status/text()", equalTo("invalid"))); + } + } } @Test @@ -255,10 +292,13 @@ public void xsd_anyuri_stored_valid() throws XMLDBException { "xs:anyURI('xmldb:exist:///db/personal/personal-valid.xml'), " + "doc('/db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); - assertEquals(query, "true", - results.getResource(0).getContent().toString()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "true", + resource.getContent().toString()); + } + } } @Test @@ -267,10 +307,13 @@ public void xsd_anyuri_stored_invalid() throws XMLDBException { "xs:anyURI('xmldb:exist:///db/personal/personal-invalid.xml'), " + "doc('/db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); - assertEquals(query, "false", - results.getResource(0).getContent().toString()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); + try (final Resource resource = result.getResource(0)) { + assertEquals(query, "false", + resource.getContent().toString()); + } + } } @Test @@ -279,11 +322,14 @@ public void xsd_anyuri_stored_report_valid() throws XMLDBException { "xs:anyURI('xmldb:exist:///db/personal/personal-valid.xml'), " + "doc('/db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); - final String r = (String) results.getResource(0).getContent(); - assertThat(r, hasXPath("//status/text()", equalTo("valid"))); + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertThat(r, hasXPath("//status/text()", equalTo("valid"))); + } + } } @Test @@ -292,10 +338,13 @@ public void xsd_anyuri_stored_report_invalid() throws XMLDBException { "xs:anyURI('xmldb:exist:///db/personal/personal-invalid.xml'), " + "doc('/db/personal/personal.xsd') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, result.getSize()); - final String r = (String) results.getResource(0).getContent(); - assertThat(r, hasXPath("//status/text()", equalTo("invalid"))); + try (final Resource resource = result.getResource(0)) { + final String r = (String) resource.getContent(); + assertThat(r, hasXPath("//status/text()", equalTo("invalid"))); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/validate/JingOnvdlTest.java b/exist-core/src/test/java/org/exist/xquery/functions/validate/JingOnvdlTest.java index 755cc53fcd..0c8d269901 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/validate/JingOnvdlTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/validate/JingOnvdlTest.java @@ -46,6 +46,7 @@ package org.exist.xquery.functions.validate; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; import static org.hamcrest.MatcherAssert.assertThat; @@ -53,8 +54,7 @@ import static org.junit.Assert.*; import static org.xmlunit.matchers.EvaluateXPathMatcher.hasXPath; -import org.xmldb.api.base.ResourceSet; - +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; /** @@ -100,19 +100,29 @@ public class JingOnvdlTest { @Before public void setUp() throws XMLDBException { final String query = "xmldb:create-collection('xmldb:exist:///db','validate-test')"; - existEmbeddedServer.executeQuery(query); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + // needed to ensure that result is closed + } final String query1 = "xmldb:store('/db/validate-test', 'test.nvdl'," + NVDL_DATA1 + ")"; - existEmbeddedServer.executeQuery(query1); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query1)) { + // needed to ensure that result is closed + } final String query2 = "xmldb:store('/db/validate-test', 'Book.rng'," + RNG_DATA1 + ")"; - existEmbeddedServer.executeQuery(query2); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query2)) { + // needed to ensure that result is closed + } final String data1 = "xmldb:store('/db/validate-test', 'valid.xml'," + XML_DATA1 + ")"; - existEmbeddedServer.executeQuery(data1); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(data1)) { + // needed to ensure that result is closed + } final String data2 = "xmldb:store('/db/validate-test', 'invalid.xml'," + XML_DATA2 + ")"; - existEmbeddedServer.executeQuery(data2); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(data2)) { + // needed to ensure that result is closed + } } @Test @@ -172,17 +182,22 @@ public void onvdl_anyuri_valid_boolean() throws XMLDBException { "xs:anyURI('xmldb:exist:///db/validate-test/valid.xml'), " + "xs:anyURI('xmldb:exist:///db/validate-test/test.nvdl') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); - assertEquals(query, "true", - results.getResource(0).getContent().toString()); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, results.getSize()); + try (final Resource resource = results.getResource(0)) { + assertEquals(query, "true", + resource.getContent().toString()); + } + } } private void executeAndEvaluate(final String query, final String expectedValue) throws XMLDBException { - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); - - final String result = (String) results.getResource(0).getContent(); - assertThat(result, hasXPath("//status/text()", equalTo(expectedValue))); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, results.getSize()); + try (final Resource resource = results.getResource(0)) { + final String result = (String) resource.getContent(); + assertThat(result, hasXPath("//status/text()", equalTo(expectedValue))); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/validate/JingRelaxNgTest.java b/exist-core/src/test/java/org/exist/xquery/functions/validate/JingRelaxNgTest.java index 5207a47484..30014fe42b 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/validate/JingRelaxNgTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/validate/JingRelaxNgTest.java @@ -47,6 +47,7 @@ import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.io.InputStreamUtil; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; import static org.exist.collections.CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE; @@ -60,7 +61,7 @@ import java.io.InputStream; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; /** @@ -83,11 +84,11 @@ public static void prepareResources() throws XMLDBException, IOException { " " + ""; - try (Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/personal")) { + try (final Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/personal")) { existEmbeddedServer.storeResource(conf, DEFAULT_COLLECTION_CONFIG_FILE, noValidation.getBytes()); } - try (Collection collection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "personal")) { + try (final Collection collection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "personal")) { for (final String testResource : TEST_RESOURCES) { try (final InputStream is = SAMPLES.getSample("validation/personal/" + testResource)) { @@ -103,10 +104,13 @@ public void rng_stored_valid_boolean() throws XMLDBException { final String query = "validation:jing( " + "doc('/db/personal/personal-valid.xml'), " + "doc('/db/personal/personal.rng') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); - assertEquals(query, "true", - results.getResource(0).getContent().toString()); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, results.getSize()); + try (final Resource resource = results.getResource(0)) { + assertEquals(query, "true", + resource.getContent().toString()); + } + } } @Test @@ -173,10 +177,13 @@ public void rnc_anyuri_invalid() throws XMLDBException { private void executeAndEvaluate(final String query, final String expectedValue) throws XMLDBException { - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, results.getSize()); - final String result = (String) results.getResource(0).getContent(); - assertThat(result, hasXPath("//status/text()", equalTo(expectedValue))); + try (final Resource resource = results.getResource(0)) { + final String result = (String) resource.getContent(); + assertThat(result, hasXPath("//status/text()", equalTo(expectedValue))); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/validate/JingSchematronTest.java b/exist-core/src/test/java/org/exist/xquery/functions/validate/JingSchematronTest.java index ea7c9a559b..dccba5a338 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/validate/JingSchematronTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/validate/JingSchematronTest.java @@ -47,6 +47,7 @@ import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.io.InputStreamUtil; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; import static org.exist.collections.CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE; @@ -60,7 +61,7 @@ import java.io.InputStream; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; /** @@ -84,12 +85,12 @@ public class JingSchematronTest { public static void prepareResources() throws XMLDBException, IOException { // Switch off validation - try (Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/tournament")) { + try (final Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/tournament")) { existEmbeddedServer.storeResource(conf, DEFAULT_COLLECTION_CONFIG_FILE, noValidation.getBytes()); } // Store schematron 1.5 test files - try (Collection col15 = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "tournament/1.5")) { + try (final Collection col15 = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "tournament/1.5")) { for (final String testResource : TEST_RESOURCES) { try (final InputStream is = SAMPLES.getSample("validation/tournament/1.5/" + testResource)) { @@ -115,11 +116,14 @@ public void sch_15_stored_valid_boolean() throws XMLDBException { "doc('/db/tournament/1.5/Tournament-valid.xml'), " + "doc('/db/tournament/1.5/tournament-schema.sch') )"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, results.getSize()); - final String r = (String) results.getResource(0).getContent(); - assertEquals("true", r); + try (final Resource resource = results.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("true", r); + } + } } @Test @@ -147,10 +151,13 @@ public void sch_15_anyuri_invalid() throws XMLDBException { } private void executeAndEvaluate(final String query, final String expectedValue) throws XMLDBException { - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, results.getSize()); - final String result = (String) results.getResource(0).getContent(); - assertThat(result, hasXPath("//status/text()", equalTo(expectedValue))); + try (final Resource resource = results.getResource(0)) { + final String result = (String) resource.getContent(); + assertThat(result, hasXPath("//status/text()", equalTo(expectedValue))); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/validate/JingXsdTest.java b/exist-core/src/test/java/org/exist/xquery/functions/validate/JingXsdTest.java index 6e4eee3eb3..b98d04f1fe 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/validate/JingXsdTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/validate/JingXsdTest.java @@ -47,6 +47,7 @@ import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.io.InputStreamUtil; +import org.exist.xmldb.EXistResourceSet; import org.junit.*; import static org.exist.collections.CollectionConfiguration.DEFAULT_COLLECTION_CONFIG_FILE; @@ -60,7 +61,7 @@ import java.io.InputStream; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; /** @@ -82,11 +83,11 @@ public static void prepareResources() throws XMLDBException, IOException { " " + ""; - try (Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/personal")) { + try (final Collection conf = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "system/config/db/personal")) { existEmbeddedServer.storeResource(conf, DEFAULT_COLLECTION_CONFIG_FILE, noValidation.getBytes()); } - try (Collection collection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "personal")) { + try (final Collection collection = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "personal")) { for (final String testResource : TEST_RESOURCES) { try (final InputStream is = SAMPLES.getSample("validation/personal/" + testResource)) { @@ -132,10 +133,13 @@ public void xsd_anyuri_invalid() throws XMLDBException { } private void executeAndEvaluate(final String query, final String expectedValue) throws XMLDBException { - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, results.getSize()); - final String result = (String) results.getResource(0).getContent(); - assertThat(result, hasXPath("//status/text()", equalTo(expectedValue))); + try (final Resource resource = results.getResource(0)) { + final String result = (String) resource.getContent(); + assertThat(result, hasXPath("//status/text()", equalTo(expectedValue))); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/xmldb/DbStore2Test.java b/exist-core/src/test/java/org/exist/xquery/functions/xmldb/DbStore2Test.java index 3ae22c7ca7..0ef95cba5d 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/xmldb/DbStore2Test.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/xmldb/DbStore2Test.java @@ -52,10 +52,10 @@ import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.ResourceHandler; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.concurrent.DBUtils; import org.junit.*; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XPathQueryService; @@ -138,22 +138,20 @@ public static void afterClass() throws Exception { @Test public final void testWithAnyUriEnabled() throws XMLDBException { final Collection rootCol = existEmbeddedServerWithAnyURI.getRoot(); - Collection testCol = rootCol.getChildCollection(TEST_COLLECTION); - if (testCol == null) { - testCol = DBUtils.addCollection(rootCol, TEST_COLLECTION); + try (final Collection testCol = DBUtils.addCollection(rootCol, TEST_COLLECTION)) { assertNotNull(testCol); - } - final XPathQueryService xpqs = testCol.getService(XPathQueryService.class); - final ResourceSet rs = - xpqs.query( - "xmldb:store(\n" + - " '/db',\n" + - " 'image.jpg',\n" + - " xs:anyURI('http://localhost:" + jettyPort + "/picture.jpg'),\n" + - " 'image/png'\n" + - " )"); - assertNotNull(rs); + final XPathQueryService xpqs = testCol.getService(XPathQueryService.class); + try (final EXistResourceSet rs = (EXistResourceSet) xpqs.query( + "xmldb:store(\n" + + " '/db',\n" + + " 'image.jpg',\n" + + " xs:anyURI('http://localhost:" + jettyPort + "/picture.jpg'),\n" + + " 'image/png'\n" + + " )")) { + assertNotNull(rs); + } + } } @Test @@ -167,21 +165,19 @@ public final void testLargeFileStore() throws XMLDBException, IOException { } final Collection rootCol = existEmbeddedServerWithAnyURI.getRoot(); - Collection testCol = rootCol.getChildCollection(TEST_COLLECTION); - if (testCol == null) { - testCol = DBUtils.addCollection(rootCol, TEST_COLLECTION); + try (final Collection testCol = DBUtils.addCollection(rootCol, TEST_COLLECTION)) { assertNotNull(testCol); - } - final XPathQueryService xpqs = testCol.getService(XPathQueryService.class); - final ResourceSet rs = - xpqs.query( - "xmldb:store(\n" + - " '/db',\n" + - " 'image.jpg',\n" + - " xs:anyURI('http://localhost:" + jettyPort + "/large-file.bin'),\n" + - " 'image/png'\n" + - " )"); - assertNotNull(rs); + final XPathQueryService xpqs = testCol.getService(XPathQueryService.class); + try (final EXistResourceSet rs = (EXistResourceSet) xpqs.query( + "xmldb:store(\n" + + " '/db',\n" + + " 'image.jpg',\n" + + " xs:anyURI('http://localhost:" + jettyPort + "/large-file.bin'),\n" + + " 'image/png'\n" + + " )")) { + assertNotNull(rs); + } + } } } \ No newline at end of file diff --git a/exist-core/src/test/java/org/exist/xquery/functions/xmldb/DbStoreTest.java b/exist-core/src/test/java/org/exist/xquery/functions/xmldb/DbStoreTest.java index c7b2914861..22bdad0e0f 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/xmldb/DbStoreTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/xmldb/DbStoreTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,6 +46,7 @@ package org.exist.xquery.functions.xmldb; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.concurrent.DBUtils; import org.junit.ClassRule; import org.junit.Test; @@ -45,22 +70,21 @@ public class DbStoreTest { @Test public final void simpleTest() throws XMLDBException { final Collection rootCol = existEmbeddedServer.getRoot(); - Collection testCol = rootCol.getChildCollection(TEST_COLLECTION); - if (testCol == null) { - testCol = DBUtils.addCollection(rootCol, TEST_COLLECTION); + try (final Collection testCol = DBUtils.addCollection(rootCol, TEST_COLLECTION)) { assertNotNull(testCol); - } - final XPathQueryService xpqs = testCol.getService(XPathQueryService.class); - assertThrows(XMLDBException.class, () -> xpqs.query( - "xmldb:store(\n" + + final XPathQueryService xpqs = testCol.getService(XPathQueryService.class); + assertThrows(XMLDBException.class, () -> { + try (final EXistResourceSet result = (EXistResourceSet) xpqs.query( + "xmldb:store(\n" + " '/db',\n" + " 'image.jpg',\n" + " xs:anyURI('https://www.example.com/image.jpg'),\n" + " 'image/png'\n" + - " )")); - - + " )")) { + // needed to ensure that result is closed + } + }); + } } - } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/xmldb/XMLDBAuthenticateTest.java b/exist-core/src/test/java/org/exist/xquery/functions/xmldb/XMLDBAuthenticateTest.java index f91276eeff..858c832a8e 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/xmldb/XMLDBAuthenticateTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/xmldb/XMLDBAuthenticateTest.java @@ -66,15 +66,16 @@ public class XMLDBAuthenticateTest extends AbstractXMLDBTest{ @Before public void beforeClass() throws XMLDBException { - final Collection root = DatabaseManager.getCollection("xmldb:exist://localhost:" + existWebServer.getPort() + "/xmlrpc/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final UserManagementService ums = root.getService(UserManagementService.class); + try (final Collection root = DatabaseManager.getCollection("xmldb:exist://localhost:" + existWebServer.getPort() + "/xmlrpc/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + final UserManagementService ums = root.getService(UserManagementService.class); - final GroupAider group1 = new GroupAider(USER1_UID); - ums.addGroup(group1); + final GroupAider group1 = new GroupAider(USER1_UID); + ums.addGroup(group1); - final UserAider user1 = new UserAider(USER1_UID, group1); - user1.setPassword(USER1_PWD); - ums.addAccount(user1); + final UserAider user1 = new UserAider(USER1_UID, group1); + user1.setPassword(USER1_PWD); + ums.addAccount(user1); + } } @Test diff --git a/exist-core/src/test/java/org/exist/xquery/functions/xquery3/DeclareVariableTest.java b/exist-core/src/test/java/org/exist/xquery/functions/xquery3/DeclareVariableTest.java index e2385d9600..c544a30307 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/xquery3/DeclareVariableTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/xquery3/DeclareVariableTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -24,9 +48,10 @@ import static org.junit.Assert.assertEquals; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; public class DeclareVariableTest { @@ -45,9 +70,12 @@ public void defaultNamespaceTest() throws XMLDBException { + "\n" + " $docPath"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - final String r = (String) results.getResource(0).getContent(); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = results.getResource(0)) { + final String r = (String) resource.getContent(); - assertEquals("/db/test.xml", r); + assertEquals("/db/test.xml", r); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/xquery3/SwitchTest.java b/exist-core/src/test/java/org/exist/xquery/functions/xquery3/SwitchTest.java index 507441d48b..6d592482fe 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/xquery3/SwitchTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/xquery3/SwitchTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,10 +46,11 @@ package org.exist.xquery.functions.xquery3; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; -import org.xmldb.api.base.ResourceSet; import org.junit.Test; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import static org.junit.Assert.*; @@ -49,9 +74,12 @@ public void oneCaseCaseMatch() throws XMLDBException { + "case 'Duck' return 'Quack'" + "default return 'Odd noise!'"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - final String r = (String) results.getResource(0).getContent(); - assertEquals("Meow", r); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = results.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("Meow", r); + } + } } @Test @@ -62,9 +90,12 @@ public void twoCaseDefault() throws XMLDBException { + "case 'Cow' case 'Calf' return 'Moo'" + "default return 'No Bull?'"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - final String r = (String) results.getResource(0).getContent(); - assertEquals("No Bull?", r); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = results.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("No Bull?", r); + } + } } @Test @@ -77,8 +108,11 @@ public void twoCaseCaseMatch() throws XMLDBException { + "case 'Duck' return 'Quack'" + "default return 'Odd noise!'"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - final String r = (String) results.getResource(0).getContent(); - assertEquals("Moo", r); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = results.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("Moo", r); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/functions/xquery3/TryCatchTest.java b/exist-core/src/test/java/org/exist/xquery/functions/xquery3/TryCatchTest.java index 7eff5ffcb3..94ba4f8f00 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/xquery3/TryCatchTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/xquery3/TryCatchTest.java @@ -47,13 +47,14 @@ import com.googlecode.junittoolbox.ParallelRunner; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.runner.RunWith; -import org.xmldb.api.base.ResourceSet; import org.exist.xquery.ErrorCodes; import org.exist.xquery.XPathException; import org.junit.Test; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmlunit.matchers.CompareMatcher; @@ -73,10 +74,13 @@ public void encapsulated_1() throws XMLDBException { final String query1 = "xquery version '3.0';" + "{ try { 'b' + 7 } catch * { 'c' } }"; - final ResourceSet results = existEmbeddedServer.executeQuery(query1); - final String r = (String) results.getResource(0).getContent(); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query1)) { + try (final Resource resource = results.getResource(0)) { + final String r = (String) resource.getContent(); - assertEquals("c", r); + assertEquals("c", r); + } + } } @Test @@ -84,11 +88,14 @@ public void encapsulated_2() throws XMLDBException { final String query1 = "xquery version '3.0';" + "for $i in (1,2,3,4) return { try { 'b' + $i } catch * { 'c' } }"; - final ResourceSet results = existEmbeddedServer.executeQuery(query1); - assertEquals(4, results.getSize()); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query1)) { + assertEquals(4, results.getSize()); - final String r = (String) results.getResource(0).getContent(); - assertEquals("c", r); + try (final Resource resource = results.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("c", r); + } + } } @Test @@ -96,22 +103,26 @@ public void encapsulated_3() throws XMLDBException { final String query1 = "xquery version '3.0';" + "{ for $i in (1,2,3,4) return { try { 'b' + $i } catch * { 'c' } } }"; - final ResourceSet results = existEmbeddedServer.executeQuery(query1); - assertEquals(1, results.getSize()); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query1)) { + assertEquals(1, results.getSize()); - final String result = (String) results.getResource(0).getContent(); - assertThat(result, CompareMatcher.isSimilarTo("cccc").ignoreWhitespace()); + try (final Resource resource = results.getResource(0)) { + final String result = (String) resource.getContent(); + assertThat(result, CompareMatcher.isSimilarTo("cccc").ignoreWhitespace()); + } + } } @Test public void xQuery3_1() throws XMLDBException { final String query1 = "xquery version '1.0';" + "try { a + 7 } catch * { 1 }"; - try { - final ResourceSet results = existEmbeddedServer.executeQuery(query1); - final String r = (String) results.getResource(0).getContent(); - assertEquals("1", r); - fail("exception expected"); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query1)) { + try (final Resource resource = results.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("1", r); + fail("exception expected"); + } } catch (final Throwable t) { final Throwable cause = t.getCause(); @@ -128,9 +139,12 @@ public void simpleCatch() throws XMLDBException { final String query = "xquery version '3.0';" + "try { a + 7 } catch * { 1 }"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - final String r = (String) results.getResource(0).getContent(); - assertEquals("1", r); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = results.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("1", r); + } + } } @Test @@ -140,14 +154,19 @@ public void catchWithCodeAndDescription() throws XMLDBException { + "catch * " + "{ $err:code, $err:description } "; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(2, results.getSize()); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + assertEquals(2, results.getSize()); - final String r1 = (String) results.getResource(0).getContent(); - assertEquals(ErrorCodes.XPDY0002.getErrorQName().getStringValue(), r1); + try (final Resource resource = results.getResource(0)) { + final String r1 = (String) resource.getContent(); + assertEquals(ErrorCodes.XPDY0002.getErrorQName().getStringValue(), r1); + } - final String r2 = (String) results.getResource(1).getContent(); - assertEquals(ErrorCodes.XPDY0002.getDescription() + " Undefined context sequence for 'child::{}a'", r2); + try (final Resource resource = results.getResource(1)) { + final String r2 = (String) resource.getContent(); + assertEquals(ErrorCodes.XPDY0002.getDescription() + " Undefined context sequence for 'child::{}a'", r2); + } + } } @Test @@ -158,9 +177,12 @@ public void catchWithError3Matches() throws XMLDBException { + "catch err:XPDY0002 { 2 }" + "catch err:XPDY0003 { 3 }"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - final String r = (String) results.getResource(0).getContent(); - assertEquals("2", r); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = results.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("2", r); + } + } } @Test(expected = XMLDBException.class) @@ -171,9 +193,12 @@ public void catchWithErrorNoMatches() throws XMLDBException { + "catch err:XPDY0002 { a }" + "catch err:XPDY0003 { 3 }"; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - final String r = (String) results.getResource(0).getContent(); - assertEquals("2", r); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + try (final Resource resource = results.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("2", r); + } + } } @Test @@ -184,9 +209,12 @@ public void catchWithMultipleMatches() throws XMLDBException { + "catch err:XPDY0002 { 2 }" + "catch err:XPDY0004 | err:XPDY0005 { 45 }"; - final ResourceSet results = existEmbeddedServer.executeQuery(query1); - final String r = (String) results.getResource(0).getContent(); - assertEquals("2", r); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query1)) { + try (final Resource resource = results.getResource(0)) { + final String r = (String) resource.getContent(); + assertEquals("2", r); + } + } final String query2 = "xquery version '3.0';" + "try { a + 7 } " @@ -194,9 +222,12 @@ public void catchWithMultipleMatches() throws XMLDBException { + "catch err:XPDY0002 { 2 }" + "catch err:XPDY0004 | err:XPDY0005 { 45 }"; - final ResourceSet results2 = existEmbeddedServer.executeQuery(query2); - final String r2 = (String) results2.getResource(0).getContent(); - assertEquals("13", r2); + try (final EXistResourceSet results2 = existEmbeddedServer.executeQuery(query2)) { + try (final Resource resource = results2.getResource(0)) { + final String r2 = (String) resource.getContent(); + assertEquals("13", r2); + } + } } @@ -208,10 +239,13 @@ public void catchFnError() throws XMLDBException { + "} catch * " + "{ $err:code }"; - final ResourceSet results = existEmbeddedServer.executeQuery(query1); - assertEquals(1, results.getSize()); - final String r1 = (String) results.getResource(0).getContent(); - assertEquals("err:FOER0000", r1); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query1)) { + assertEquals(1, results.getSize()); + try (final Resource resource = results.getResource(0)) { + final String r1 = (String) resource.getContent(); + assertEquals("err:FOER0000", r1); + } + } final String query2 = "xquery version '3.0';" @@ -220,10 +254,13 @@ public void catchFnError() throws XMLDBException { + "} catch * " + "{ $err:code }"; - final ResourceSet results2 = existEmbeddedServer.executeQuery(query2); - assertEquals(1, results2.getSize()); - final String r2 = (String) results2.getResource(0).getContent(); - assertEquals("err:FOER0000", r2); + try (final EXistResourceSet results2 = existEmbeddedServer.executeQuery(query2)) { + assertEquals(1, results2.getSize()); + try (final Resource resource = results2.getResource(0)) { + final String r2 = (String) resource.getContent(); + assertEquals("err:FOER0000", r2); + } + } final String query3 = "xquery version '3.0';" @@ -232,13 +269,17 @@ public void catchFnError() throws XMLDBException { + "} catch * " + "{ $err:code, $err:description }"; - final ResourceSet results3 = existEmbeddedServer.executeQuery(query3); - assertEquals(2, results3.getSize()); - final String r31 = (String) results3.getResource(0).getContent(); - assertEquals("err:FOER0000", r31); - final String r32 = (String) results3.getResource(1).getContent(); - assertEquals("TEST", r32); - + try (final EXistResourceSet results3 = existEmbeddedServer.executeQuery(query3)) { + assertEquals(2, results3.getSize()); + try (final Resource resource = results3.getResource(0)) { + final String r31 = (String) resource.getContent(); + assertEquals("err:FOER0000", r31); + } + try (final Resource resource = results3.getResource(1)) { + final String r32 = (String) resource.getContent(); + assertEquals("TEST", r32); + } + } final String query4 = "xquery version '3.0';" + "try {" @@ -246,13 +287,17 @@ public void catchFnError() throws XMLDBException { + "} catch * " + "{ $err:code, $err:description }"; - final ResourceSet results4 = existEmbeddedServer.executeQuery(query4); - assertEquals(2, results4.getSize()); - final String r41 = (String) results4.getResource(0).getContent(); - assertEquals("err:FOER0000", r41); - final String r42 = (String) results4.getResource(1).getContent(); - assertEquals("TEST", r42); - + try (final EXistResourceSet results4 = existEmbeddedServer.executeQuery(query4)) { + assertEquals(2, results4.getSize()); + try (final Resource resource = results4.getResource(0)) { + final String r41 = (String) resource.getContent(); + assertEquals("err:FOER0000", r41); + } + try (final Resource resource = results4.getResource(1)) { + final String r42 = (String) resource.getContent(); + assertEquals("TEST", r42); + } + } final String query5 = "xquery version '3.0';" + "try {" @@ -260,14 +305,21 @@ public void catchFnError() throws XMLDBException { + "} catch * " + "{ $err:code, $err:description, $err:value }"; - final ResourceSet results5 = existEmbeddedServer.executeQuery(query5); - assertEquals(3, results5.getSize()); - final String r51 = (String) results5.getResource(0).getContent(); - assertEquals("err:FOER0000", r51); - final String r52 = (String) results5.getResource(1).getContent(); - assertEquals("TEST", r52); - final String r53 = (String) results5.getResource(2).getContent(); - assertEquals("", r53); + try (final EXistResourceSet results5 = existEmbeddedServer.executeQuery(query5)) { + assertEquals(3, results5.getSize()); + try (final Resource resource = results5.getResource(0)) { + final String r51 = (String) resource.getContent(); + assertEquals("err:FOER0000", r51); + } + try (final Resource resource = results5.getResource(1)) { + final String r52 = (String) resource.getContent(); + assertEquals("TEST", r52); + } + try (final Resource resource = results5.getResource(2)) { + final String r53 = (String) resource.getContent(); + assertEquals("", r53); + } + } } @Test @@ -277,17 +329,24 @@ public void catchFullErrorCode() throws XMLDBException { + "catch * " + "{ $err:code, $err:description, empty($err:value) } "; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(3, results.getSize()); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + assertEquals(3, results.getSize()); - final String r1 = (String) results.getResource(0).getContent(); - assertEquals(ErrorCodes.XPDY0002.getErrorQName().getStringValue(), r1); + try (final Resource resource = results.getResource(0)) { + final String r1 = (String) resource.getContent(); + assertEquals(ErrorCodes.XPDY0002.getErrorQName().getStringValue(), r1); + } - final String r2 = (String) results.getResource(1).getContent(); - assertEquals(ErrorCodes.XPDY0002.getDescription() + " Undefined context sequence for 'child::{}a'", r2); + try (final Resource resource = results.getResource(1)) { + final String r2 = (String) resource.getContent(); + assertEquals(ErrorCodes.XPDY0002.getDescription() + " Undefined context sequence for 'child::{}a'", r2); + } - final String r3 = (String) results.getResource(2).getContent(); - assertEquals("true", r3); + try (final Resource resource = results.getResource(2)) { + final String r3 = (String) resource.getContent(); + assertEquals("true", r3); + } + } } @Test @@ -300,10 +359,13 @@ public void catchDefinedNamespace() throws XMLDBException { + "catch foo:ERRORNAME { 'good' } " + "catch * { 'bad' } "; - final ResourceSet results = existEmbeddedServer.executeQuery(query1); - assertEquals(1, results.getSize()); - final String r1 = (String) results.getResource(0).getContent(); - assertEquals("good", r1); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query1)) { + assertEquals(1, results.getSize()); + try (final Resource resource = results.getResource(0)) { + final String r1 = (String) resource.getContent(); + assertEquals("good", r1); + } + } final String query2 = "xquery version '3.0';" @@ -314,10 +376,13 @@ public void catchDefinedNamespace() throws XMLDBException { + "catch foo:ERRORNAME { $err:code } " + "catch * { 'bad' } "; - final ResourceSet results2 = existEmbeddedServer.executeQuery(query2); - assertEquals(1, results2.getSize()); - final String r2 = (String) results2.getResource(0).getContent(); - assertEquals("foo:ERRORNAME", r2); + try (final EXistResourceSet results2 = existEmbeddedServer.executeQuery(query2)) { + assertEquals(1, results2.getSize()); + try (final Resource resource = results2.getResource(0)) { + final String r2 = (String) resource.getContent(); + assertEquals("foo:ERRORNAME", r2); + } + } } @Test @@ -330,10 +395,13 @@ public void catchDefinedNamespace2() throws XMLDBException { + "catch foo:ERRORNAME { 'good' } " + "catch * { 'wrong' } "; - final ResourceSet results = existEmbeddedServer.executeQuery(query); - assertEquals(1, results.getSize()); + try (final EXistResourceSet results = existEmbeddedServer.executeQuery(query)) { + assertEquals(1, results.getSize()); - final String r1 = (String) results.getResource(0).getContent(); - assertEquals("good", r1); + try (final Resource resource = results.getResource(0)) { + final String r1 = (String) resource.getContent(); + assertEquals("good", r1); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/update/AbstractUpdateTest.java b/exist-core/src/test/java/org/exist/xquery/update/AbstractUpdateTest.java index a21f2bfa46..1bdd2caaca 100644 --- a/exist-core/src/test/java/org/exist/xquery/update/AbstractUpdateTest.java +++ b/exist-core/src/test/java/org/exist/xquery/update/AbstractUpdateTest.java @@ -47,18 +47,20 @@ import org.exist.TestUtils; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.IndexQueryService; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XQueryService; +import javax.annotation.Nullable; + import static org.junit.Assert.assertEquals; /** @@ -82,9 +84,7 @@ public abstract class AbstractUpdateTest { @Before public void setUp() throws Exception { - final CollectionManagementService service = - existEmbeddedServer.getRoot().getService( - CollectionManagementService.class); + final CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); testCollection = service.createCollection("test"); final IndexQueryService idx = testCollection.getService(IndexQueryService.class); @@ -93,13 +93,15 @@ public void setUp() throws Exception { @After public void tearDown() throws XMLDBException { - CollectionManagementService service = - existEmbeddedServer.getRoot().getService( - CollectionManagementService.class); - service.removeCollection("test"); - Collection confColl = DatabaseManager.getCollection("xmldb:exist:///db/system/config/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - service = confColl.getService(CollectionManagementService.class); + testCollection.close(); + CollectionManagementService service = existEmbeddedServer.getRoot().getService(CollectionManagementService.class); service.removeCollection("test"); + + try (final Collection confColl = DatabaseManager.getCollection("xmldb:exist:///db/system/config/db", TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD)) { + service = confColl.getService(CollectionManagementService.class); + service.removeCollection("test"); + } + testCollection = null; } @@ -109,28 +111,27 @@ public void tearDown() throws XMLDBException { * @return the XQuery Service * @throws XMLDBException */ - protected XQueryService storeXMLStringAndGetQueryService(final String documentName, - final String content) throws XMLDBException { - final XMLResource doc = - testCollection.createResource( - documentName, XMLResource.class ); - doc.setContent(content); - testCollection.storeResource(doc); - final XQueryService service = - testCollection.getService(XQueryService.class); - return service; + protected void storeXMLString(final String documentName, final String content) throws XMLDBException { + try (final XMLResource doc = testCollection.createResource(documentName, XMLResource.class)) { + doc.setContent(content); + testCollection.storeResource(doc); + } + } + + protected void queryResourceV(final String resource, final String query, final int expected) throws XMLDBException { + try (final EXistResourceSet result = queryResource(resource, query, expected, null)) { + // needed to ensure that result is closed + } } /** Helper that performs an XQuery and does JUnit assertion on result size. - * @see #queryResource(XQueryService, String, String, int, String) + * @see #queryResource(String, String, int, String) */ - protected ResourceSet queryResource(final XQueryService service, final String resource, - final String query, final int expected) throws XMLDBException { - return queryResource(service, resource, query, expected, null); + protected EXistResourceSet queryResource(final String resource, final String query, final int expected) throws XMLDBException { + return queryResource(resource, query, expected, null); } /** Helper that performs an XQuery and does JUnit assertion on result size. - * @param service XQuery service * @param resource database resource (collection) to query * @param query * @param expected size of result @@ -138,9 +139,9 @@ protected ResourceSet queryResource(final XQueryService service, final String re * @return a ResourceSet, allowing to do more assertions if necessary. * @throws XMLDBException */ - protected ResourceSet queryResource(final XQueryService service, final String resource, - final String query, final int expected, final String message) throws XMLDBException { - final ResourceSet result = service.queryResource(resource, query); + protected EXistResourceSet queryResource(final String resource, final String query, final int expected, @Nullable final String message) throws XMLDBException { + final XQueryService service = testCollection.getService(XQueryService.class); + final EXistResourceSet result = (EXistResourceSet) service.queryResource(resource, query); if (message == null) { assertEquals(query, expected, result.getSize()); } else { diff --git a/exist-core/src/test/java/org/exist/xquery/update/IndexIntegrationTest.java b/exist-core/src/test/java/org/exist/xquery/update/IndexIntegrationTest.java index bf11223949..a05c978ea2 100644 --- a/exist-core/src/test/java/org/exist/xquery/update/IndexIntegrationTest.java +++ b/exist-core/src/test/java/org/exist/xquery/update/IndexIntegrationTest.java @@ -45,18 +45,17 @@ */ package org.exist.xquery.update; +import com.evolvedbinary.j8fu.function.RunnableE; import org.easymock.IArgumentMatcher; import org.easymock.IMocksControl; import org.exist.dom.persistent.*; import org.exist.indexing.*; import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; -import com.evolvedbinary.j8fu.function.ConsumerE; import org.exist.xmldb.XmldbURI; import org.exist.xquery.XQueryContext; import org.junit.Test; import org.xmldb.api.base.XMLDBException; -import org.xmldb.api.modules.XQueryService; import java.util.Optional; import java.util.function.BiConsumer; @@ -66,8 +65,8 @@ public class IndexIntegrationTest extends AbstractUpdateTest { - private void run(final XmldbURI docUri, final String data, final BiConsumer setup, ConsumerE test) throws Exception { - final XQueryService service = storeXMLStringAndGetQueryService(docUri.lastSegment().toString(), data); + private void run(final XmldbURI docUri, final String data, final BiConsumer setup, final RunnableE test) throws Exception { + storeXMLString(docUri.lastSegment().toString(), data); final IMocksControl control = createStrictControl(); @@ -102,7 +101,7 @@ private void run(final XmldbURI docUri, final String data, final BiConsumer queryResource(service, docName, "update insert into /test", 0) + () -> queryResourceV(docName, "update insert into /test", 0) ); } @@ -194,7 +193,7 @@ public void updateAttribute() throws Exception { //flush worker.flush(); expectLastCall(); }, - service -> queryResource(service, docName, "update value //t/@xml:id with 'id2'", 0) + () -> queryResourceV(docName, "update value //t/@xml:id with 'id2'", 0) ); } @@ -230,7 +229,7 @@ public void removeAttribute() throws Exception { //flush worker.flush(); expectLastCall(); }, - service -> queryResource(service, docName, "update delete //t/@xml:id", 0) + () -> queryResourceV(docName, "update delete //t/@xml:id", 0) ); } diff --git a/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTest.java b/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTest.java index b564912172..1510959353 100644 --- a/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTest.java +++ b/exist-core/src/test/java/org/exist/xquery/update/UpdateInsertTest.java @@ -47,7 +47,6 @@ import org.junit.Test; import org.xmldb.api.base.XMLDBException; -import org.xmldb.api.modules.XQueryService; import java.util.UUID; @@ -61,22 +60,21 @@ public class UpdateInsertTest extends AbstractUpdateTest { @Test public void insertNamespacedAttribute() throws XMLDBException { final String docName = "pathNs2.xml"; - final XQueryService service = - storeXMLStringAndGetQueryService(docName, ""); + storeXMLString(docName, ""); - queryResource(service, docName, "//t[@xml:id]", 0); + queryResourceV(docName, "//t[@xml:id]", 0); String update = "update insert into /test"; - queryResource(service, docName, update, 0); + queryResourceV(docName, update, 0); - queryResource(service, docName, "//t[@xml:id eq 'id1']", 1); - queryResource(service, docName, "/test/id('id1')", 1); + queryResourceV(docName, "//t[@xml:id eq 'id1']", 1); + queryResourceV(docName, "/test/id('id1')", 1); update = "update value //t/@xml:id with 'id2'"; - queryResource(service, docName, update, 0); + queryResourceV(docName, update, 0); - queryResource(service, docName, "//t[@xml:id eq 'id2']", 1); - queryResource(service, docName, "id('id2', /test)", 1); + queryResourceV(docName, "//t[@xml:id eq 'id2']", 1); + queryResourceV(docName, "id('id2', /test)", 1); } @Test @@ -95,18 +93,17 @@ public void insertPrecedingAttribute() throws XMLDBException { ""; final String docName = "A00969_annotations.xml"; - final XQueryService service = - storeXMLStringAndGetQueryService(docName, doc); + storeXMLString(docName, doc); - queryResource(service, docName, "//annotation-item[@temp-id = '" + tempId + "']/@status", 1); - queryResource(service, docName, "//annotation-item[@temp-id = '" + tempId + "']/@id", 0); + queryResourceV(docName, "//annotation-item[@temp-id = '" + tempId + "']/@status", 1); + queryResourceV(docName, "//annotation-item[@temp-id = '" + tempId + "']/@id", 0); final String uuid = UUID.randomUUID().toString(); final String update = "update insert attribute id {'" + uuid + "'} preceding //annotation-item[@temp-id = '" + tempId + "']/@status"; - queryResource(service, docName, update, 0); + queryResourceV(docName, update, 0); - queryResource(service, docName, "//annotation-item[@temp-id = '" + tempId + "']/@id", 1); + queryResourceV(docName, "//annotation-item[@temp-id = '" + tempId + "']/@id", 1); } @Test @@ -114,17 +111,16 @@ public void insertInMemoryDocument() throws XMLDBException { final String doc = ""; final String docName = "empty.xml"; - final XQueryService service = - storeXMLStringAndGetQueryService(docName, doc); + storeXMLString(docName, doc); - queryResource(service, docName, "//empty/child::node()", 0); + queryResourceV(docName, "//empty/child::node()", 0); final String uuid = UUID.randomUUID().toString(); final String update = "update insert document { " + uuid + " } into /empty"; - queryResource(service, docName, update, 0); + queryResourceV(docName, update, 0); - queryResource(service, docName, "//empty/uuid", 1); + queryResourceV(docName, "//empty/uuid", 1); } } diff --git a/exist-core/src/test/java/org/exist/xquery/update/UpdateReplaceTest.java b/exist-core/src/test/java/org/exist/xquery/update/UpdateReplaceTest.java index c6feac14c8..e3aa32fb0e 100644 --- a/exist-core/src/test/java/org/exist/xquery/update/UpdateReplaceTest.java +++ b/exist-core/src/test/java/org/exist/xquery/update/UpdateReplaceTest.java @@ -45,10 +45,10 @@ */ package org.exist.xquery.update; +import org.exist.xmldb.EXistResourceSet; import org.junit.Test; import org.w3c.dom.Document; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XQueryService; @@ -75,26 +75,30 @@ public void replaceOnlyChildWhereParentHasNoAttributes() throws XMLDBException { " update replace $legacy with ,\n" + " doc('/db/test/" + testDocName + "')/Test"; - final XQueryService xqueryService = storeXMLStringAndGetQueryService(testDocName, testDoc); - final ResourceSet result = xqueryService.query(updateQuery); - assertNotNull(result); - assertEquals(1, result.getSize()); + storeXMLString(testDocName, testDoc); + final XQueryService service = testCollection.getService(XQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(updateQuery)) { + assertNotNull(result); + assertEquals(1, result.getSize()); - final Resource res1 = result.getResource(0); - assertNotNull(res1); - assertEquals(XML_RESOURCE, res1.getResourceType()); - final Document doc = ((XMLResource) res1).getContentAsDOM().getOwnerDocument(); - final Source actual = Input.fromDocument(doc).build(); - final Source expected = Input.fromString("").build(); + try (final Resource res1 = result.getResource(0)) { + assertNotNull(res1); + assertEquals(XML_RESOURCE, res1.getResourceType()); + final Document doc = ((XMLResource) res1).getContentAsDOM().getOwnerDocument(); - final Diff diff = DiffBuilder - .compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); + final Source actual = Input.fromDocument(doc).build(); + final Source expected = Input.fromString("").build(); - assertFalse(diff.toString(), diff.hasDifferences()); + final Diff diff = DiffBuilder + .compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); + + assertFalse(diff.toString(), diff.hasDifferences()); + } + } } @Test @@ -109,26 +113,29 @@ public void replaceFirstChildWhereParentHasNoAttributes() throws XMLDBException " update replace $legacy with ,\n" + " doc('/db/test/" + testDocName + "')/Test"; - final XQueryService xqueryService = storeXMLStringAndGetQueryService(testDocName, testDoc); - final ResourceSet result = xqueryService.query(updateQuery); - assertNotNull(result); - assertEquals(1, result.getSize()); - - final Resource res1 = result.getResource(0); - assertNotNull(res1); - assertEquals(XML_RESOURCE, res1.getResourceType()); - final Document doc = ((XMLResource) res1).getContentAsDOM().getOwnerDocument(); - - final Source actual = Input.fromDocument(doc).build(); - final Source expected = Input.fromString("").build(); - - final Diff diff = DiffBuilder - .compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); - - assertFalse(diff.toString(), diff.hasDifferences()); + storeXMLString(testDocName, testDoc); + final XQueryService service = testCollection.getService(XQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(updateQuery)) { + assertNotNull(result); + assertEquals(1, result.getSize()); + + try (final Resource res1 = result.getResource(0)) { + assertNotNull(res1); + assertEquals(XML_RESOURCE, res1.getResourceType()); + final Document doc = ((XMLResource) res1).getContentAsDOM().getOwnerDocument(); + + final Source actual = Input.fromDocument(doc).build(); + final Source expected = Input.fromString("").build(); + + final Diff diff = DiffBuilder + .compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); + + assertFalse(diff.toString(), diff.hasDifferences()); + } + } } @Test @@ -143,26 +150,29 @@ public void replaceOnlyChildWhereParentHasAttribute() throws XMLDBException { " update replace $legacy with ,\n" + " doc('/db/test/" + testDocName + "')/Test"; - final XQueryService xqueryService = storeXMLStringAndGetQueryService(testDocName, testDoc); - final ResourceSet result = xqueryService.query(updateQuery); - assertNotNull(result); - assertEquals(1, result.getSize()); - - final Resource res1 = result.getResource(0); - assertNotNull(res1); - assertEquals(XML_RESOURCE, res1.getResourceType()); - final Document doc = ((XMLResource) res1).getContentAsDOM().getOwnerDocument(); - - final Source actual = Input.fromDocument(doc).build(); - final Source expected = Input.fromString("").build(); - - final Diff diff = DiffBuilder - .compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); - - assertFalse(diff.toString(), diff.hasDifferences()); + storeXMLString(testDocName, testDoc); + final XQueryService service = testCollection.getService(XQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(updateQuery)) { + assertNotNull(result); + assertEquals(1, result.getSize()); + + try (final Resource res1 = result.getResource(0)) { + assertNotNull(res1); + assertEquals(XML_RESOURCE, res1.getResourceType()); + final Document doc = ((XMLResource) res1).getContentAsDOM().getOwnerDocument(); + + final Source actual = Input.fromDocument(doc).build(); + final Source expected = Input.fromString("").build(); + + final Diff diff = DiffBuilder + .compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); + + assertFalse(diff.toString(), diff.hasDifferences()); + } + } } @Test @@ -177,25 +187,28 @@ public void replaceFirstChildWhereParentHasAttribute() throws XMLDBException { " update replace $legacy with ,\n" + " doc('/db/test/" + testDocName + "')/Test"; - final XQueryService xqueryService = storeXMLStringAndGetQueryService(testDocName, testDoc); - final ResourceSet result = xqueryService.query(updateQuery); - assertNotNull(result); - assertEquals(1, result.getSize()); - - final Resource res1 = result.getResource(0); - assertNotNull(res1); - assertEquals(XML_RESOURCE, res1.getResourceType()); - final Document doc = ((XMLResource) res1).getContentAsDOM().getOwnerDocument(); - - final Source actual = Input.fromDocument(doc).build(); - final Source expected = Input.fromString("").build(); - - final Diff diff = DiffBuilder - .compare(expected) - .withTest(actual) - .checkForSimilar() - .build(); - - assertFalse(diff.toString(), diff.hasDifferences()); + storeXMLString(testDocName, testDoc); + final XQueryService service = testCollection.getService(XQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(updateQuery)) { + assertNotNull(result); + assertEquals(1, result.getSize()); + + try (final Resource res1 = result.getResource(0)) { + assertNotNull(res1); + assertEquals(XML_RESOURCE, res1.getResourceType()); + final Document doc = ((XMLResource) res1).getContentAsDOM().getOwnerDocument(); + + final Source actual = Input.fromDocument(doc).build(); + final Source expected = Input.fromString("").build(); + + final Diff diff = DiffBuilder + .compare(expected) + .withTest(actual) + .checkForSimilar() + .build(); + + assertFalse(diff.toString(), diff.hasDifferences()); + } + } } } diff --git a/exist-core/src/test/java/org/exist/xquery/update/UpdateValueTest.java b/exist-core/src/test/java/org/exist/xquery/update/UpdateValueTest.java index bce889f6f9..aae34b5a32 100644 --- a/exist-core/src/test/java/org/exist/xquery/update/UpdateValueTest.java +++ b/exist-core/src/test/java/org/exist/xquery/update/UpdateValueTest.java @@ -47,8 +47,6 @@ import org.junit.Test; import org.xmldb.api.base.XMLDBException; -import org.xmldb.api.modules.XQueryService; - /** * @author Adam Retter @@ -58,25 +56,22 @@ public class UpdateValueTest extends AbstractUpdateTest { @Test public void updateNamespacedAttribute() throws XMLDBException { final String docName = "pathNs.xml"; - final XQueryService service = - storeXMLStringAndGetQueryService(docName, ""); + storeXMLString(docName, ""); - queryResource(service, docName, "//t[@xml:id eq 'id1']", 1); + queryResourceV(docName, "//t[@xml:id eq 'id1']", 1); - queryResource(service, docName, "update value //t/@xml:id with 'id2'", 0); + queryResourceV(docName, "update value //t/@xml:id with 'id2'", 0); - queryResource(service, docName, "//t[@xml:id eq 'id2']", 1); - queryResource(service, docName, "id('id2', /test)", 1); + queryResourceV(docName, "//t[@xml:id eq 'id2']", 1); + queryResourceV(docName, "id('id2', /test)", 1); } @Test public void updateAttributeInNamespacedElement() throws XMLDBException { final String docName = "docNs.xml"; - final XQueryService service = - storeXMLStringAndGetQueryService(docName, ""); + storeXMLString(docName, ""); - queryResource(service, docName, "declare namespace t=\"http://test.com\"; update value /t:test/@id with " + - "'id2'", 0); - queryResource(service, docName, "declare namespace t=\"http://test.com\"; /t:test[@id = 'id2']", 1); + queryResourceV(docName, "declare namespace t=\"http://test.com\"; update value /t:test/@id with 'id2'", 0); + queryResourceV(docName, "declare namespace t=\"http://test.com\"; /t:test[@id = 'id2']", 1); } } diff --git a/exist-core/src/test/java/org/exist/xquery/value/Base64BinaryTest.java b/exist-core/src/test/java/org/exist/xquery/value/Base64BinaryTest.java index e9f5b20af0..503a24bf6b 100644 --- a/exist-core/src/test/java/org/exist/xquery/value/Base64BinaryTest.java +++ b/exist-core/src/test/java/org/exist/xquery/value/Base64BinaryTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,10 +46,12 @@ package org.exist.xquery.value; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.junit.ClassRule; import org.junit.Test; import static org.junit.Assert.assertEquals; -import org.xmldb.api.base.ResourceSet; + +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XQueryService; @@ -44,11 +70,11 @@ public void castToBase64ThenBackToString() throws XMLDBException { final String query = "let $data := '" + base64String + "' cast as xs:base64Binary return $data cast as xs:string"; final XQueryService service = server.getRoot().getService(XQueryService.class); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query); + final Resource resource = result.getResource(0)) { - final ResourceSet result = service.query(query); - - final String queryResult = (String)result.getResource(0).getContent(); - - assertEquals(base64String, queryResult); + final String queryResult = (String) resource.getContent(); + assertEquals(base64String, queryResult); + } } } diff --git a/exist-core/src/test/java/org/exist/xupdate/RemoveAppendTest.java b/exist-core/src/test/java/org/exist/xupdate/RemoveAppendTest.java index 714cdd7b40..790a7955e9 100644 --- a/exist-core/src/test/java/org/exist/xupdate/RemoveAppendTest.java +++ b/exist-core/src/test/java/org/exist/xupdate/RemoveAppendTest.java @@ -57,6 +57,7 @@ import org.exist.security.PermissionDeniedException; import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.LockException; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.XmldbURI; import org.exist.xmldb.concurrent.DBUtils; import org.junit.*; @@ -65,7 +66,7 @@ import static org.junit.Assert.assertNotNull; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; +import org.xmldb.api.base.Resource; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XPathQueryService; @@ -94,28 +95,32 @@ public class RemoveAppendTest { @Ignore @Test public void testRemoveAppend() throws Exception { - XUpdateQueryService service = testCol.getService(XUpdateQueryService.class); - XPathQueryService query = testCol.getService(XPathQueryService.class); + final XUpdateQueryService service = testCol.getService(XUpdateQueryService.class); + final XPathQueryService query = testCol.getService(XPathQueryService.class); for (int i = 1; i < 1000; i++) { int which = rand.nextInt(ITEM_COUNT) + 1; insert(service, which); remove(service, which); - ResourceSet result = query.query("/test/item[@id='" + which + "']"); - assertEquals(result.getSize(), 1); - result.getResource(0).getContent(); + try (final EXistResourceSet result = (EXistResourceSet) query.query("/test/item[@id='" + which + "']")) { + assertEquals(result.getSize(), 1); + try (final Resource resource = result.getResource(0)) { + resource.getContent(); + } + } } } @Test public void appendRemove() throws XMLDBException, IOException { - XUpdateQueryService service = testCol.getService(XUpdateQueryService.class); - XPathQueryService query = testCol.getService(XPathQueryService.class); + final XUpdateQueryService service = testCol.getService(XUpdateQueryService.class); + final XPathQueryService query = testCol.getService(XPathQueryService.class); for (int i = 1; i <= 100; i++) { append(service, i); - - ResourceSet result = query.query("/test/item[@id='" + i + "']"); - assertEquals(result.getSize(), 1); + + try (final EXistResourceSet result = (EXistResourceSet) query.query("/test/item[@id='" + i + "']")) { + assertEquals(result.getSize(), 1); + } } for (int i = 100; i > 10; i--) { @@ -125,8 +130,10 @@ public void appendRemove() throws XMLDBException, IOException { ""; long mods = service.update(xu); assertEquals(mods, 1); - - ResourceSet result = query.query("/test/item/e0"); + + try (final EXistResourceSet result = (EXistResourceSet) query.query("/test/item/e0")) { + // needed to ensure that result is closed + } } } @@ -172,7 +179,7 @@ public void setUp() throws Exception { rootCol = existXmldbEmbeddedServer.getRoot(); testCol = rootCol.getChildCollection(XmldbURI.ROOT_COLLECTION + "/test"); - if(testCol != null) { + if (testCol != null) { CollectionManagementService mgr = DBUtils.getCollectionManagementService(rootCol); mgr.removeCollection(XmldbURI.ROOT_COLLECTION + "/test"); } @@ -184,7 +191,9 @@ public void setUp() throws Exception { } @After - public void tearDown() throws LockException, TriggerException, PermissionDeniedException, EXistException, IOException { + public void tearDown() throws LockException, TriggerException, PermissionDeniedException, EXistException, IOException, XMLDBException { + testCol.close(); + TestUtils.cleanupDB(); } diff --git a/exist-core/src/test/java/org/exist/xupdate/StressTest.java b/exist-core/src/test/java/org/exist/xupdate/StressTest.java index 15dc3b589c..06de79bbd3 100644 --- a/exist-core/src/test/java/org/exist/xupdate/StressTest.java +++ b/exist-core/src/test/java/org/exist/xupdate/StressTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -32,6 +56,7 @@ import org.exist.security.PermissionDeniedException; import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.LockException; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.XmldbURI; import org.exist.xmldb.concurrent.DBUtils; import org.junit.After; @@ -44,7 +69,6 @@ import org.junit.Test; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -101,12 +125,14 @@ private void insertTags() throws XMLDBException { tagsWritten[i] = tag; final String query = "//" + tagsWritten[rand.nextInt(i + 1)]; - final ResourceSet result = xquery.query(query); - assertEquals(result.getSize(), 1); + try (final EXistResourceSet result = (EXistResourceSet) xquery.query(query)) { + assertEquals(result.getSize(), 1); + } } - final XMLResource res = (XMLResource) testCol.getResource("test.xml"); - assertNotNull(res); + try (final XMLResource res = (XMLResource) testCol.getResource("test.xml")) { + assertNotNull(res); + } } private void removeTags() throws XMLDBException { @@ -127,14 +153,17 @@ private void removeTags() throws XMLDBException { private void fetchDb() throws XMLDBException { final XPathQueryService xquery = testCol.getService(XPathQueryService.class); - final ResourceSet result = xquery.query("for $n in collection('" + XmldbURI.ROOT_COLLECTION + "/test')//* return local-name($n)"); + try (final EXistResourceSet result = (EXistResourceSet) xquery.query("for $n in collection('" + XmldbURI.ROOT_COLLECTION + "/test')//* return local-name($n)")) { - for (int i = 0; i < result.getSize(); i++) { - final Resource r = result.getResource(i); - final String tag = r.getContent().toString(); + for (int i = 0; i < result.getSize(); i++) { + try (final Resource r = result.getResource(i)) { + final String tag = r.getContent().toString(); - final ResourceSet result2 = xquery.query("//" + tag); - assertEquals(result2.getSize(), 1); + try (final EXistResourceSet result2 = (EXistResourceSet) xquery.query("//" + tag)) { + assertEquals(result2.getSize(), 1); + } + } + } } } @@ -160,6 +189,8 @@ public void setUp() throws XMLDBException { @After public void tearDown() throws XMLDBException, LockException, TriggerException, PermissionDeniedException, EXistException, IOException { + testCol.close(); + TestUtils.cleanupDB(); } } diff --git a/exist-core/src/test/java/org/exist/xupdate/XUpdateTest.java b/exist-core/src/test/java/org/exist/xupdate/XUpdateTest.java index f0b1af3086..c2c7673b94 100644 --- a/exist-core/src/test/java/org/exist/xupdate/XUpdateTest.java +++ b/exist-core/src/test/java/org/exist/xupdate/XUpdateTest.java @@ -173,9 +173,10 @@ public void xupdate() throws Exception { private void addDocument(final String sourceFile) throws XMLDBException, IOException, URISyntaxException { final Path f = getRelFile(SOURCE_DIR_NAME + "/" + sourceFile); - final XMLResource document = col.createResource(XUPDATE_FILE, XMLResource.class); - document.setContent(f); - col.storeResource(document); + try (final XMLResource document = col.createResource(XUPDATE_FILE, XMLResource.class)) { + document.setContent(f); + col.storeResource(document); + } } private Path getRelFile(final String relPath) throws IOException, URISyntaxException { @@ -193,8 +194,9 @@ private Path getRelFile(final String relPath) throws IOException, URISyntaxExcep } private void removeDocument() throws XMLDBException { - final Resource document = col.getResource(XUPDATE_FILE); - col.removeResource(document); + try (final Resource document = col.getResource(XUPDATE_FILE)) { + col.removeResource(document); + } } /** @@ -208,8 +210,9 @@ private String updateDocument(final Path updateFile) throws XMLDBException, IOEx service.update(xUpdateModifications); - final XMLResource ret = (XMLResource) col.getResource(XUPDATE_FILE); - return ((String) ret.getContent()); + try (final XMLResource ret = (XMLResource) col.getResource(XUPDATE_FILE)) { + return ((String) ret.getContent()); + } } @Before diff --git a/exist-distribution/pom.xml b/exist-distribution/pom.xml index 226cb35e5f..97899e75db 100644 --- a/exist-distribution/pom.xml +++ b/exist-distribution/pom.xml @@ -772,9 +772,9 @@ - - - + + + @@ -828,9 +828,9 @@ - - - + + + @@ -917,7 +917,7 @@ copy - + true @@ -977,7 +977,7 @@ ${assemble.dir} - + etc true logs @@ -1583,4 +1583,4 @@ - + \ No newline at end of file diff --git a/exist-docker/pom.xml b/exist-docker/pom.xml index 12316f3bf7..cae66debb6 100644 --- a/exist-docker/pom.xml +++ b/exist-docker/pom.xml @@ -248,7 +248,7 @@ - + false @@ -258,7 +258,7 @@ META-INF/mailcap.default - + true diff --git a/exist-xqts/pom.xml b/exist-xqts/pom.xml index 53d6578775..644cb2b41a 100644 --- a/exist-xqts/pom.xml +++ b/exist-xqts/pom.xml @@ -178,7 +178,7 @@ ${assemble.dir} - + etc true logs diff --git a/extensions/debuggee/pom.xml b/extensions/debuggee/pom.xml index d44f958f53..e4dd789b63 100644 --- a/extensions/debuggee/pom.xml +++ b/extensions/debuggee/pom.xml @@ -194,4 +194,4 @@ - + \ No newline at end of file diff --git a/extensions/images/pom.xml b/extensions/images/pom.xml index 8ac4c00a03..db31f03142 100644 --- a/extensions/images/pom.xml +++ b/extensions/images/pom.xml @@ -157,4 +157,4 @@ - + \ No newline at end of file diff --git a/extensions/indexes/lucene/pom.xml b/extensions/indexes/lucene/pom.xml index 98e20536b1..f5ce413a83 100644 --- a/extensions/indexes/lucene/pom.xml +++ b/extensions/indexes/lucene/pom.xml @@ -244,6 +244,7 @@ src/main/java/org/exist/indexing/lucene/AbstractFieldConfig.java src/main/java/org/exist/indexing/lucene/AbstractTextExtractor.java src/main/java/org/exist/indexing/lucene/AnalyzerConfig.java + src/test/java/org/exist/indexing/lucene/ConcurrencyTest.java src/main/java/org/exist/indexing/lucene/DefaultTextExtractor.java src/main/java/org/exist/indexing/lucene/FieldType.java src/main/java/org/exist/indexing/lucene/LuceneConfig.java @@ -255,6 +256,7 @@ src/main/java/org/exist/indexing/lucene/LuceneIndexWorker.java src/main/java/org/exist/indexing/lucene/LuceneMatchListener.java src/test/java/org/exist/indexing/lucene/LuceneMatchListenerTest.java + src/test/java/org/exist/indexing/lucene/OptimizerTest.java src/test/java/org/exist/indexing/lucene/SerializeAttrMatchesTest.java src/main/java/org/exist/indexing/lucene/TextExtractor.java src/main/java/org/exist/indexing/lucene/XMLToQuery.java @@ -282,6 +284,7 @@ src/main/java/org/exist/indexing/lucene/AbstractFieldConfig.java src/main/java/org/exist/indexing/lucene/AbstractTextExtractor.java src/main/java/org/exist/indexing/lucene/AnalyzerConfig.java + src/test/java/org/exist/indexing/lucene/ConcurrencyTest.java src/main/java/org/exist/indexing/lucene/DefaultTextExtractor.java src/main/java/org/exist/indexing/lucene/FieldType.java src/main/java/org/exist/indexing/lucene/LuceneConfig.java @@ -293,6 +296,7 @@ src/main/java/org/exist/indexing/lucene/LuceneIndexWorker.java src/main/java/org/exist/indexing/lucene/LuceneMatchListener.java src/test/java/org/exist/indexing/lucene/LuceneMatchListenerTest.java + src/test/java/org/exist/indexing/lucene/OptimizerTest.java src/test/java/org/exist/indexing/lucene/SerializeAttrMatchesTest.java src/main/java/org/exist/indexing/lucene/TextExtractor.java src/main/java/org/exist/indexing/lucene/XMLToQuery.java diff --git a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/ConcurrencyTest.java b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/ConcurrencyTest.java index 9e36160f6c..afb4414566 100644 --- a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/ConcurrencyTest.java +++ b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/ConcurrencyTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -42,6 +66,7 @@ import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.LockException; import org.exist.util.io.InputStreamUtil; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.EXistXQueryService; import org.exist.xmldb.IndexQueryService; import org.junit.AfterClass; @@ -50,7 +75,6 @@ import org.junit.Test; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Resource; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XMLResource; import org.xmldb.api.modules.XUpdateQueryService; @@ -147,29 +171,36 @@ private void storeRemoveDocs(final String collectionName) throws XMLDBException, storeDocs(collectionName); final EXistXQueryService xqs = test.getService(EXistXQueryService.class); - ResourceSet result = xqs.query("//SPEECH[ft:query(LINE, 'king')]"); - assertEquals(98, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) xqs.query("//SPEECH[ft:query(LINE, 'king')]")) { + assertEquals(98, result.getSize()); + } - result = xqs.query("//SPEECH[ft:query(SPEAKER, 'juliet')]"); - assertEquals(118, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) xqs.query("//SPEECH[ft:query(SPEAKER, 'juliet')]")) { + assertEquals(118, result.getSize()); + } - for (String resourceName : test.listResources()) { - final Resource resource = test.getResource(resourceName); - test.removeResource(resource); + for (final String resourceName : test.listResources()) { + try (final Resource resource = test.getResource(resourceName)) { + test.removeResource(resource); + } } - result = xqs.query("//SPEECH[ft:query(LINE, 'king')]"); - assertEquals(0, result.getSize()); - result = xqs.query("//SPEECH[ft:query(SPEAKER, 'juliet')]"); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) xqs.query("//SPEECH[ft:query(LINE, 'king')]")) { + assertEquals(0, result.getSize()); + } + + try (final EXistResourceSet result = (EXistResourceSet) xqs.query("//SPEECH[ft:query(SPEAKER, 'juliet')]")) { + assertEquals(0, result.getSize()); + } } private void xupdateDocs(final String collectionName) throws XMLDBException, IOException, URISyntaxException { storeDocs(collectionName); final EXistXQueryService xqs = test.getService(EXistXQueryService.class); - ResourceSet result = xqs.query("//SPEECH[ft:query(SPEAKER, 'juliet')]"); - assertEquals(118, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) xqs.query("//SPEECH[ft:query(SPEAKER, 'juliet')]")) { + assertEquals(118, result.getSize()); + } final String xupdate = LuceneIndexTest.XUPDATE_START + @@ -178,37 +209,33 @@ private void xupdateDocs(final String collectionName) throws XMLDBException, IOE final XUpdateQueryService xuqs = test.getService(XUpdateQueryService.class); xuqs.update(xupdate); - result = xqs.query("//SPEECH[ft:query(SPEAKER, 'juliet')]"); - assertEquals(0, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) xqs.query("//SPEECH[ft:query(SPEAKER, 'juliet')]")) { + assertEquals(0, result.getSize()); + } - result = xqs.query("//SPEECH[ft:query(LINE, 'king')]"); - assertEquals(98, result.getSize()); + try (final EXistResourceSet result = (EXistResourceSet) xqs.query("//SPEECH[ft:query(LINE, 'king')]")) { + assertEquals(98, result.getSize()); + } } - private void storeDocs(final String collectionName) throws XMLDBException, IOException, URISyntaxException { - Collection collection = null; - try { - collection = existEmbeddedServer.createCollection(test, collectionName); + private void storeDocs(final String collectionName) throws XMLDBException, IOException { + try (final Collection collection = existEmbeddedServer.createCollection(test, collectionName)) { final IndexQueryService iqs = collection.getService(IndexQueryService.class); iqs.configureCollection(COLLECTION_CONFIG1); for (final String sampleName : SAMPLES.getShakespeareXmlSampleNames()) { - final Resource resource = collection.createResource(sampleName, XMLResource.class); - try (final InputStream is = SAMPLES.getShakespeareSample(sampleName)) { + try (final Resource resource = collection.createResource(sampleName, XMLResource.class); + final InputStream is = SAMPLES.getShakespeareSample(sampleName)) { resource.setContent(InputStreamUtil.readString(is, UTF_8)); + collection.storeResource(resource); } - collection.storeResource(resource); - } - } finally { - if(collection != null) { - collection.close(); } } } @BeforeClass - public static void initDB() throws ClassNotFoundException, IllegalAccessException, InstantiationException, XMLDBException { + public static void initDB() throws XMLDBException { test = existEmbeddedServer.createCollection(existEmbeddedServer.getRoot(), "test"); } diff --git a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/OptimizerTest.java b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/OptimizerTest.java index 4dfac1da1e..c285a051b5 100644 --- a/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/OptimizerTest.java +++ b/extensions/indexes/lucene/src/test/java/org/exist/indexing/lucene/OptimizerTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -25,12 +49,12 @@ import org.exist.test.ExistEmbeddedServer; import org.exist.test.ExistXmldbEmbeddedServer; import org.exist.util.io.InputStreamUtil; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.IndexQueryService; import org.exist.xquery.FunctionFactory; import org.junit.*; import org.junit.runner.RunWith; import org.xmldb.api.base.Collection; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XMLResource; @@ -43,6 +67,7 @@ import static org.exist.util.PropertiesBuilder.propertiesBuilder; import static org.junit.Assert.assertEquals; import static org.exist.samples.Samples.SAMPLES; +import static org.junit.Assert.assertNotNull; /** * @@ -143,7 +168,7 @@ public void booleanOperator() throws XMLDBException { execute("//SPEECH[(ft:query(LINE, 'juliet') and ft:query(LINE, 'romeo')) or SPEAKER='HAMLET']", true, MSG_OPT_ERROR, r); } - private long execute(String query, boolean optimize) throws XMLDBException { + private long execute(String query, final boolean optimize) throws XMLDBException { XQueryService service = testCollection.getService(XQueryService.class); if (optimize) { query = OPTIMIZE + query; @@ -151,19 +176,22 @@ private long execute(String query, boolean optimize) throws XMLDBException { query = NO_OPTIMIZE + query; } query = NAMESPACES + query; - ResourceSet result = service.query(query); - return result.getSize(); + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + return result.getSize(); + } } - private void execute(String query, boolean optimize, String message, long expected) throws XMLDBException { - XQueryService service = testCollection.getService(XQueryService.class); + private void execute(String query, final boolean optimize, final String message, final long expected) throws XMLDBException { + final XQueryService service = testCollection.getService(XQueryService.class); if (optimize) { query = NAMESPACES + OPTIMIZE + query; } else { query = NAMESPACES + NO_OPTIMIZE + query; } - ResourceSet result = service.query(query); - assertEquals(message, expected, result.getSize()); + + try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { + assertEquals(message, expected, result.getSize()); + } } @ClassRule @@ -178,21 +206,27 @@ private void execute(String query, boolean optimize, String message, long expect public static void initDatabase() throws XMLDBException, IOException { CollectionManagementService service = server.getRoot().getService(CollectionManagementService.class); testCollection = service.createCollection("test"); - Assert.assertNotNull(testCollection); + assertNotNull(testCollection); - IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); + final IndexQueryService idxConf = testCollection.getService(IndexQueryService.class); idxConf.configureCollection(COLLECTION_CONFIG); - XMLResource resource = testCollection.createResource("test.xml", XMLResource.class); - resource.setContent(XML); - testCollection.storeResource(resource); + try (final XMLResource resource = testCollection.createResource("test.xml", XMLResource.class)) { + resource.setContent(XML); + testCollection.storeResource(resource); + } for (final String sampleName : SAMPLES.getShakespeareXmlSampleNames()) { - resource = testCollection.createResource(sampleName, XMLResource.class); - try (final InputStream is = SAMPLES.getShakespeareSample(sampleName)) { + try (final XMLResource resource = testCollection.createResource(sampleName, XMLResource.class); + final InputStream is = SAMPLES.getShakespeareSample(sampleName)) { resource.setContent(InputStreamUtil.readString(is, UTF_8)); + testCollection.storeResource(resource); } - testCollection.storeResource(resource); } } + + @BeforeClass + public static void tearDown() throws XMLDBException { + testCollection.close(); + } } diff --git a/extensions/modules/counter/pom.xml b/extensions/modules/counter/pom.xml index dad11100ba..d542ba9837 100644 --- a/extensions/modules/counter/pom.xml +++ b/extensions/modules/counter/pom.xml @@ -141,6 +141,7 @@ pom.xml src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml + src/test/java/org/exist/xquery/modules/counter/CounterTest.java @@ -153,6 +154,7 @@ pom.xml src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml + src/test/java/org/exist/xquery/modules/counter/CounterTest.java diff --git a/extensions/modules/counter/src/test/java/org/exist/xquery/modules/counter/CounterTest.java b/extensions/modules/counter/src/test/java/org/exist/xquery/modules/counter/CounterTest.java index eed2428085..53a862fd96 100644 --- a/extensions/modules/counter/src/test/java/org/exist/xquery/modules/counter/CounterTest.java +++ b/extensions/modules/counter/src/test/java/org/exist/xquery/modules/counter/CounterTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -24,10 +48,10 @@ import static org.junit.Assert.assertEquals; import org.exist.test.ExistXmldbEmbeddedServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xquery.XPathException; import org.junit.ClassRule; import org.junit.Test; -import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; /** @@ -44,45 +68,51 @@ public class CounterTest { @Test public void createAndDestroyCounter() throws XPathException, XMLDBException { String query = IMPORT + "counter:create('jasper1')"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - String r = (String) result.getResource(0).getContent(); - assertEquals("0", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final String r = (String) result.getResource(0).getContent(); + assertEquals("0", r); + } query = IMPORT +"counter:next-value('jasper1')"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals("1", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final String r = (String) result.getResource(0).getContent(); + assertEquals("1", r); + } query = IMPORT +"counter:destroy('jasper1')"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals("true", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final String r = (String) result.getResource(0).getContent(); + assertEquals("true", r); + } } @Test public void createAndInitAndDestroyCounter() throws XPathException, XMLDBException { String query = IMPORT +"counter:create('jasper3',xs:long(1200))"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - String r = (String) result.getResource(0).getContent(); - assertEquals("1200", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final String r = (String) result.getResource(0).getContent(); + assertEquals("1200", r); + } query = IMPORT +"counter:next-value('jasper3')"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals("1201", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final String r = (String) result.getResource(0).getContent(); + assertEquals("1201", r); + } query = IMPORT +"counter:destroy('jasper3')"; - result = existEmbeddedServer.executeQuery(query); - r = (String) result.getResource(0).getContent(); - assertEquals("true", r); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + final String r = (String) result.getResource(0).getContent(); + assertEquals("true", r); + } } @Test public void threadedIncrement() throws XPathException, InterruptedException, XMLDBException { String query = IMPORT +"counter:create('jasper2')"; - ResourceSet result = existEmbeddedServer.executeQuery(query); - - assertEquals("0", result.getResource(0).getContent()); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + assertEquals("0", result.getResource(0).getContent()); + } Thread a = new IncrementThread(); a.start(); @@ -96,25 +126,30 @@ public void threadedIncrement() throws XPathException, InterruptedException, XML c.join(); query = IMPORT +"counter:next-value('jasper2')"; - ResourceSet valueAfter = existEmbeddedServer.executeQuery(query); - - query = IMPORT +"counter:destroy('jasper2')"; - result = existEmbeddedServer.executeQuery(query); - - assertEquals("601", (String)valueAfter.getResource(0).getContent()); + try (final EXistResourceSet valueAfter = existEmbeddedServer.executeQuery(query)) { + + query = IMPORT + "counter:destroy('jasper2')"; + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + // needed to ensure that result is closed + } + + assertEquals("601", (String) valueAfter.getResource(0).getContent()); + } } static class IncrementThread extends Thread { - + + @Override public void run() { try { - for (int i=0; i<200; i++) { + for (int i = 0; i < 200; i++) { final String query = IMPORT +"counter:next-value('jasper2')"; - final ResourceSet result = existEmbeddedServer.executeQuery(query); - result.getResource(0).getContent(); + try (final EXistResourceSet result = existEmbeddedServer.executeQuery(query)) { + result.getResource(0).getContent(); + } } - } catch (XMLDBException e) { - e.printStackTrace(); + } catch (final XMLDBException e) { + e.printStackTrace(); } } } diff --git a/extensions/modules/file/pom.xml b/extensions/modules/file/pom.xml index 01a8f3fc2d..2ba79ffa95 100644 --- a/extensions/modules/file/pom.xml +++ b/extensions/modules/file/pom.xml @@ -222,6 +222,7 @@ src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml src/test/resources/standalone-webapp/WEB-INF/web.xml + src/test/java/org/exist/xquery/modules/file/AbstractBinariesTest.java src/main/java/org/exist/xquery/modules/file/DirectoryList.java src/test/java/org/exist/xquery/modules/file/EmbeddedBinariesTest.java src/main/java/org/exist/xquery/modules/file/FileModule.java @@ -229,6 +230,7 @@ src/main/java/org/exist/xquery/modules/file/FileReadUnicode.java src/test/java/org/exist/xquery/modules/file/RestBinariesTest.java src/main/java/org/exist/xquery/modules/file/Sync.java + src/test/java/org/exist/xquery/modules/file/XmldbBinariesTest.java @@ -242,6 +244,7 @@ src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml src/test/resources/standalone-webapp/WEB-INF/web.xml + src/test/java/org/exist/xquery/modules/file/AbstractBinariesTest.java src/main/java/org/exist/xquery/modules/file/DirectoryList.java src/test/java/org/exist/xquery/modules/file/EmbeddedBinariesTest.java src/main/java/org/exist/xquery/modules/file/FileModule.java @@ -249,6 +252,7 @@ src/main/java/org/exist/xquery/modules/file/FileReadUnicode.java src/test/java/org/exist/xquery/modules/file/RestBinariesTest.java src/main/java/org/exist/xquery/modules/file/Sync.java + src/test/java/org/exist/xquery/modules/file/XmldbBinariesTest.java diff --git a/extensions/modules/file/src/test/java/org/exist/xquery/modules/file/AbstractBinariesTest.java b/extensions/modules/file/src/test/java/org/exist/xquery/modules/file/AbstractBinariesTest.java index b704ac9d09..539b3f14b8 100644 --- a/extensions/modules/file/src/test/java/org/exist/xquery/modules/file/AbstractBinariesTest.java +++ b/extensions/modules/file/src/test/java/org/exist/xquery/modules/file/AbstractBinariesTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -23,7 +47,10 @@ import com.evolvedbinary.j8fu.function.Consumer2E; import org.exist.xmldb.XmldbURI; -import org.junit.*; +import org.junit.After; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Test; import org.junit.rules.TemporaryFolder; import java.io.IOException; @@ -36,6 +63,7 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; /** * Tests for accessing binaries using XQuery via various APIs. @@ -80,8 +108,18 @@ public void readBinary() throws Exception { assertEquals(1, size(results)); final U item = item(results, 0); - assertTrue(isBinaryType(item)); - assertArrayEquals(data, getBytes(item)); + try { + assertTrue(isBinaryType(item)); + assertArrayEquals(data, getBytes(item)); + } finally { + if (item instanceof AutoCloseable) { + try { + ((AutoCloseable) item).close(); + } catch (final Exception e) { + fail(e.getMessage()); + } + } + } }); } @@ -106,8 +144,18 @@ public void readAndWriteBinary() throws Exception { assertEquals(1, size(results)); final U item = item(results, 0); - assertTrue(isBooleanType(item)); - assertEquals(true, getBoolean(item)); + try { + assertTrue(isBooleanType(item)); + assertEquals(true, getBoolean(item)); + } finally { + if (item instanceof AutoCloseable) { + try { + ((AutoCloseable) item).close(); + } catch (final Exception e) { + fail(e.getMessage()); + } + } + } }); assertArrayEquals(Files.readAllBytes(tmpInFile), Files.readAllBytes(tmpOutFile)); diff --git a/extensions/modules/file/src/test/java/org/exist/xquery/modules/file/XmldbBinariesTest.java b/extensions/modules/file/src/test/java/org/exist/xquery/modules/file/XmldbBinariesTest.java index 0835828536..c1a88b23b6 100644 --- a/extensions/modules/file/src/test/java/org/exist/xquery/modules/file/XmldbBinariesTest.java +++ b/extensions/modules/file/src/test/java/org/exist/xquery/modules/file/XmldbBinariesTest.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -22,12 +46,16 @@ package org.exist.xquery.modules.file; import org.exist.test.ExistWebServer; +import org.exist.xmldb.EXistResourceSet; import org.exist.xmldb.XmldbURI; import org.junit.ClassRule; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.xmldb.api.DatabaseManager; -import org.xmldb.api.base.*; +import org.xmldb.api.base.Collection; +import org.xmldb.api.base.CompiledExpression; +import org.xmldb.api.base.Resource; +import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.BinaryResource; import org.xmldb.api.modules.CollectionManagementService; import org.xmldb.api.modules.XQueryService; @@ -44,7 +72,7 @@ * @author Adam Retter */ @RunWith(Parameterized.class) -public class XmldbBinariesTest extends AbstractBinariesTest { +public class XmldbBinariesTest extends AbstractBinariesTest { @ClassRule public static final ExistWebServer existWebServer = new ExistWebServer(true, false, true, true); @@ -86,15 +114,16 @@ protected void storeBinaryFile(final XmldbURI filePath, byte[] content) throws E } final String fileName = filePath.lastSegment().toString(); - final Resource resource = current.createResource(fileName, BinaryResource.class); - resource.setContent(content); - current.storeResource(resource); + try (final Resource resource = current.createResource(fileName, BinaryResource.class)) { + resource.setContent(content); + current.storeResource(resource); + } } finally { while(!cols.isEmpty()) { try { cols.pop().close(); - } catch(XMLDBException e) { + } catch(final XMLDBException e) { } } @@ -140,7 +169,7 @@ protected void removeCollection(final XmldbURI collectionUri) throws Exception { } @Override - protected QueryResultAccessor executeXQuery(final String query) throws Exception { + protected QueryResultAccessor executeXQuery(final String query) throws Exception { return consumer -> { Collection colRoot = null; try { @@ -148,7 +177,7 @@ protected QueryResultAccessor executeXQuery(final S final XQueryService xqueryService = colRoot.getService(XQueryService.class); final CompiledExpression compiledExpression = xqueryService.compile(query); - final ResourceSet results = xqueryService.execute(compiledExpression); + final EXistResourceSet results = (EXistResourceSet) xqueryService.execute(compiledExpression); try { @@ -167,12 +196,12 @@ protected QueryResultAccessor executeXQuery(final S } @Override - protected long size(final ResourceSet results) throws XMLDBException { + protected long size(final EXistResourceSet results) throws XMLDBException { return results.getSize(); } @Override - protected Resource item(final ResourceSet results, final int index) throws XMLDBException { + protected Resource item(final EXistResourceSet results, final int index) throws XMLDBException { return results.getResource(index); } diff --git a/extensions/modules/mail/pom.xml b/extensions/modules/mail/pom.xml index e30f291996..434b3ccf6c 100644 --- a/extensions/modules/mail/pom.xml +++ b/extensions/modules/mail/pom.xml @@ -286,4 +286,4 @@ - + \ No newline at end of file diff --git a/extensions/modules/persistentlogin/src/test/java/org/exist/xquery/modules/persistentlogin/LoginModuleTest.java b/extensions/modules/persistentlogin/src/test/java/org/exist/xquery/modules/persistentlogin/LoginModuleTest.java index 2f755f3c80..0606832fe4 100644 --- a/extensions/modules/persistentlogin/src/test/java/org/exist/xquery/modules/persistentlogin/LoginModuleTest.java +++ b/extensions/modules/persistentlogin/src/test/java/org/exist/xquery/modules/persistentlogin/LoginModuleTest.java @@ -102,12 +102,13 @@ public void setup() throws XMLDBException { "sm:id()/(descendant::sm:effective,descendant::sm:real)[1]/sm:username/string()"; root = DatabaseManager.getCollection("xmldb:exist://localhost:" + EXIST_WEB_SERVER.getPort() + "/xmlrpc" + XmldbURI.ROOT_COLLECTION, TestUtils.ADMIN_DB_USER, TestUtils.ADMIN_DB_PWD); - final BinaryResource res = root.createResource(XQUERY_FILENAME, BinaryResource.class); - ((EXistResource) res).setMediaType(MediaType.APPLICATION_XQUERY); - res.setContent(xquery); - root.storeResource(res); - final UserManagementService ums = root.getService(UserManagementService.class); - ums.chmod(res, 0777); + try (final BinaryResource res = root.createResource(XQUERY_FILENAME, BinaryResource.class)) { + ((EXistResource) res).setMediaType(MediaType.APPLICATION_XQUERY); + res.setContent(xquery); + root.storeResource(res); + final UserManagementService ums = root.getService(UserManagementService.class); + ums.chmod(res, 0777); + } final BasicCookieStore store = new BasicCookieStore(); client = HttpClientBuilder.create().setDefaultCookieStore(store).build(); @@ -115,8 +116,12 @@ public void setup() throws XMLDBException { @After public void cleanup() throws XMLDBException { - final BinaryResource res = (BinaryResource)root.getResource(XQUERY_FILENAME); - root.removeResource(res); + try (final BinaryResource res = (BinaryResource)root.getResource(XQUERY_FILENAME)) { + root.removeResource(res); + } finally { + root.close(); + root = null; + } } @Test diff --git a/extensions/modules/sql-oracle/pom.xml b/extensions/modules/sql-oracle/pom.xml index 08e48d4285..18d3835a75 100644 --- a/extensions/modules/sql-oracle/pom.xml +++ b/extensions/modules/sql-oracle/pom.xml @@ -158,4 +158,4 @@ - + \ No newline at end of file diff --git a/extensions/security/ldap/pom.xml b/extensions/security/ldap/pom.xml index 9449d14210..b5898b041d 100644 --- a/extensions/security/ldap/pom.xml +++ b/extensions/security/ldap/pom.xml @@ -101,8 +101,8 @@ ldap-realm.xsd pom.xml src/main/java/** - src/test/resources/log4j2.xml src/test/resources-filtered/conf.xml + src/test/resources/log4j2.xml @@ -122,8 +122,8 @@ ldap-realm.xsd pom.xml - src/test/resources/log4j2.xml src/test/resources-filtered/conf.xml + src/test/resources/log4j2.xml src/main/java/org/exist/security/realm/ldap/AbstractLDAPSearchPrincipal.java src/main/java/org/exist/security/realm/ldap/LDAPContextFactory.java src/main/java/org/exist/security/realm/ldap/LDAPRealm.java diff --git a/extensions/security/pom.xml b/extensions/security/pom.xml index 01c5b689fc..e1f19dc019 100644 --- a/extensions/security/pom.xml +++ b/extensions/security/pom.xml @@ -125,4 +125,4 @@ - + \ No newline at end of file diff --git a/extensions/xqdoc/pom.xml b/extensions/xqdoc/pom.xml index de3be116e1..e808e8cc1b 100644 --- a/extensions/xqdoc/pom.xml +++ b/extensions/xqdoc/pom.xml @@ -174,6 +174,7 @@ pom.xml src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml + src/main/java/org/exist/xqdoc/ant/XQDocTask.java src/main/java/org/exist/xqdoc/xquery/Scan.java @@ -188,6 +189,7 @@ xqdoc-1.0.xsd src/test/resources-filtered/conf.xml src/test/resources/log4j2.xml + src/main/java/org/exist/xqdoc/ant/XQDocTask.java src/main/java/org/exist/xqdoc/xquery/Scan.java diff --git a/extensions/xqdoc/src/main/java/org/exist/xqdoc/ant/XQDocTask.java b/extensions/xqdoc/src/main/java/org/exist/xqdoc/ant/XQDocTask.java index f5fab9143a..0a2d4c1ce7 100644 --- a/extensions/xqdoc/src/main/java/org/exist/xqdoc/ant/XQDocTask.java +++ b/extensions/xqdoc/src/main/java/org/exist/xqdoc/ant/XQDocTask.java @@ -1,4 +1,28 @@ /* + * Elemental + * Copyright (C) 2024, Evolved Binary Ltd + * + * admin@evolvedbinary.com + * https://www.evolvedbinary.com | https://www.elemental.xyz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * NOTE: Parts of this file contain code from 'The eXist-db Authors'. + * The original license header is included below. + * + * ===================================================================== + * * eXist-db Open Source Native XML Database * Copyright (C) 2001 The eXist-db Authors * @@ -81,48 +105,58 @@ public void execute() throws BuildException { path = uri.substring(p + 3); Collection root = null; - if (createCollection) - { - root = DatabaseManager.getCollection(baseURI + XmldbURI.ROOT_COLLECTION, user, password); - root = mkcol(root, baseURI, XmldbURI.ROOT_COLLECTION, path); - } else - root = DatabaseManager.getCollection(uri, user, password); + try { + if (createCollection) { + root = DatabaseManager.getCollection(baseURI + XmldbURI.ROOT_COLLECTION, user, password); + root = mkcol(root, baseURI, XmldbURI.ROOT_COLLECTION, path); + } else { + root = DatabaseManager.getCollection(uri, user, password); + } - EXistXQueryService service = root.getService(EXistXQueryService.class); - Source source = new StringSource(XQUERY); - service.declareVariable("collection", root.getName()); - service.declareVariable("uri", ""); - if (moduleURI != null) { - service.declareVariable("uri", moduleURI); - service.declareVariable("data", ""); - service.execute(source); - } else { - for(FileSet fileSet: fileSets) { - DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject()); - scanner.scan(); - String[] files = scanner.getIncludedFiles(); - log("Found " + files.length + " files to upload.\n"); + EXistXQueryService service = root.getService(EXistXQueryService.class); + Source source = new StringSource(XQUERY); + service.declareVariable("collection", root.getName()); + service.declareVariable("uri", ""); + if (moduleURI != null) { + service.declareVariable("uri", moduleURI); + service.declareVariable("data", ""); + service.execute(source); + } else { + for (FileSet fileSet : fileSets) { + DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject()); + scanner.scan(); + String[] files = scanner.getIncludedFiles(); + log("Found " + files.length + " files to upload.\n"); - Path baseDir=scanner.getBasedir().toPath(); - for (String s : files) { - Path file = baseDir.resolve(s); - log("Storing " + s + " ...\n"); - byte[] data = read(file); - try { - service.declareVariable("name", FileUtils.fileName(file)); - service.declareVariable("data", data); - service.execute(source); - } catch (XMLDBException e) { - String msg = "XMLDB exception caught: " + e.getMessage(); - if (failonerror) - throw new BuildException(msg, e); - else - log(msg, e, Project.MSG_ERR); + Path baseDir = scanner.getBasedir().toPath(); + for (String s : files) { + Path file = baseDir.resolve(s); + log("Storing " + s + " ...\n"); + byte[] data = read(file); + try { + service.declareVariable("name", FileUtils.fileName(file)); + service.declareVariable("data", data); + service.execute(source); + } catch (XMLDBException e) { + String msg = "XMLDB exception caught: " + e.getMessage(); + if (failonerror) + throw new BuildException(msg, e); + else + log(msg, e, Project.MSG_ERR); + } } } } + } finally { + if (root != null) { + try { + root.close(); + } catch (final XMLDBException e) { + // no-op + } + } } - } catch (XMLDBException e) { + } catch (final XMLDBException e) { String msg="XMLDB exception caught: " + e.getMessage(); if(failonerror) throw new BuildException(msg,e); From d936ceaa994b28c09e176ca7302e49c6cc7624f4 Mon Sep 17 00:00:00 2001 From: Adam Retter Date: Sat, 23 May 2026 14:22:42 +0200 Subject: [PATCH 5/5] [bugfix] Enable tests that were previously ignored that now pass --- .../java/org/exist/xquery/XQueryTest.java | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/exist-core/src/test/java/org/exist/xquery/XQueryTest.java b/exist-core/src/test/java/org/exist/xquery/XQueryTest.java index 7cad3979f0..03ab57ad19 100644 --- a/exist-core/src/test/java/org/exist/xquery/XQueryTest.java +++ b/exist-core/src/test/java/org/exist/xquery/XQueryTest.java @@ -722,11 +722,10 @@ public void typedVariables() throws XMLDBException { query = "let $v as document-node() := doc('" + XmldbURI.ROOT_COLLECTION + "/test/" + NUMBERS_XML + "') \n" + "return $v"; try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { assertEquals("XQuery: " + query, 1, result.getSize()); - //TODO : no way to test the node type ? - //assertEquals( "XQuery: " + query, Node.DOCUMENT_NODE, ((XMLResource)result.getResource(0))); try (final XMLResource resource = (XMLResource) result.getResource(0)) { final Node n = resource.getContentAsDOM(); assertTrue(n instanceof Document); + assertEquals("XQuery: " + query, Node.DOCUMENT_NODE, n.getNodeType()); assertEquals("XQuery: " + query, "test", ((Document) n).getDocumentElement().getNodeName()); } } @@ -904,33 +903,37 @@ public void improbableAxesAndNodeTestsCombinations() throws XMLDBException { } assertTrue(exceptionThrown); - //TODO : uncomment when PI are OK - - /* query = "let $a := ac/self::processing-instruction('foo') return {$a}"; try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { assertEquals( "XQuery: " + query, 1, result.getSize() ); - assertEquals( "XQuery: " + query, "", ((XMLResource)result.getResource(0)).getContent()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } } query = "let $a := ac/parent::processing-instruction('foo') return {$a}"; try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { assertEquals( "XQuery: " + query, 1, result.getSize() ); - assertEquals( "XQuery: " + query, "", ((XMLResource)result.getResource(0)).getContent()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } } query = "let $a := ac/ancestor::processing-instruction('foo') return {$a}"; try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { assertEquals( "XQuery: " + query, 1, result.getSize() ); - assertEquals( "XQuery: " + query, "", ((XMLResource)result.getResource(0)).getContent()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } } query = "let $a := ac/ancestor-or-self::processing-instruction('foo') return {$a}"; try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { assertEquals( "XQuery: " + query, 1, result.getSize() ); - assertEquals( "XQuery: " + query, "", ((XMLResource)result.getResource(0)).getContent()); + try (final Resource resource = result.getResource(0)) { + assertEquals("XQuery: " + query, "", resource.getContent()); + } } - */ // This one is intercepted by the parser query = "let $a := ac/attribute::processing-instruction('foo') return {$a}"; @@ -1501,13 +1504,12 @@ public void functionDoc() throws XMLDBException, IOException, SAXException { boolean exceptionThrown = false; String message = ""; try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { - //TODO : to be decided ! - //assertTrue(exceptionThrown); assertEquals(0, result.getSize()); } catch (final XMLDBException e) { exceptionThrown = true; message = e.getMessage(); } + assertFalse(message, exceptionThrown); query = "doc-available('" + XmldbURI.ROOT_COLLECTION + "/test/" + NUMBERS_XML + "')"; try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { @@ -1867,11 +1869,10 @@ public void serialization() throws XMLDBException { message = ""; try (final EXistResourceSet result = (EXistResourceSet) service.query(query)) { // needed to make sure that result is closed - } catch (final XMLDBException e) { - message = e.getMessage(); + try (final Resource resource = result.getResource(0)) { + assertEquals("bar", resource.getContent()); + } } - //TODO : how toserialize this resultand get the error ? -pb - //assertTrue(message.indexOf("XQDY0025") > -1); } /** CAUTION side effect on field xml @@ -1943,9 +1944,7 @@ public void xupdateWithAdjacentTextNodes() throws XMLDBException { } } - //TODO : understand this test and make sure that the expected result is correct - //expected:<3> but was:<2> - @Ignore + @Ignore("Understand this test and make sure that the expected result is correct - expected:<3> but was:<2>") @Test public void xupdateAttributesAndElements() throws XMLDBException { final String query = @@ -2616,7 +2615,6 @@ public void stringOfEmptySequence_1841105() throws XMLDBException { /** * http://sourceforge.net/support/tracker.php?aid=2871975 */ - @Ignore @Test public void stringOfEmptySequenceWithExplicitContext_2871975() throws XMLDBException { // OK