Skip to content

Commit 7e865e5

Browse files
committed
[feature] New implementation of Java Binding from XQuery
Closes eXist-db/exist#5090
1 parent 47fa733 commit 7e865e5

File tree

16 files changed

+3759
-285
lines changed

16 files changed

+3759
-285
lines changed

exist-core/pom.xml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -981,6 +981,8 @@
981981
<include>src/test/java/org/exist/xquery/ImportFromPkgTest.java</include>
982982
<include>src/test/java/org/exist/xquery/ImportModuleTest.java</include>
983983
<include>src/main/java/org/exist/xquery/Intersect.java</include>
984+
<include>src/main/java/org/exist/xquery/JavaBinding.java</include>
985+
<include>src/test/java/org/exist/xquery/JavaBindingTest.java</include>
984986
<include>src/test/java/org/exist/xquery/LocationStepTest.java</include>
985987
<include>src/main/java/org/exist/xquery/Materializable.java</include>
986988
<include>src/main/java/org/exist/xquery/PerformanceStatsService.java</include>
@@ -1028,6 +1030,7 @@
10281030
<include>src/test/java/org/exist/xquery/functions/session/AbstractSessionTest.java</include>
10291031
<include>src/test/java/org/exist/xquery/functions/session/AttributeTest.java</include>
10301032
<include>src/test/java/org/exist/xquery/functions/system/GetRunningXQueriesTest.java</include>
1033+
<include>src/main/java/org/exist/xquery/functions/system/FunctionAvailable.java</include>
10311034
<include>src/test/java/org/exist/xquery/functions/transform/TransformTest.java</include>
10321035
<include>src/main/java/org/exist/xquery/functions/util/Eval.java</include>
10331036
<include>src/main/java/org/exist/xquery/functions/util/InspectFunction.java</include>
@@ -1060,6 +1063,7 @@
10601063
<include>src/test/java/xquery/xqsuite/XQSuiteTests.java</include>
10611064
<include>src/main/resources-filtered/org/exist/system.properties</include>
10621065
<include>src/test/resources-filtered/org/exist/xquery/import-from-pkg-test.conf.xml</include>
1066+
<include>src/test/resources-filtered/org/exist/xquery/JavaBindingTest.conf.xml</include>
10631067
<include>src/test/resources/collection.xconf.init</include>
10641068
<include>src/main/resources/org/exist/client/security/AccessControlEntryDialog.form</include>
10651069
<include>src/main/resources/org/exist/client/security/EditPropertiesDialog.form</include>
@@ -1273,11 +1277,15 @@
12731277
<include>src/test/java/org/exist/xmldb/CreateCollectionsTest.java</include>
12741278
<include>src/main/java/org/exist/xmldb/RemoteRestoreService.java</include>
12751279
<include>src/main/java/org/exist/xqj/Marshaller.java</include>
1280+
<include>src/main/java/org/exist/xquery/DynamicTypeCheck.java</include>
1281+
<include>src/main/java/org/exist/xquery/ErrorCodes.java</include>
12761282
<include>src/main/java/org/exist/xquery/FunctionFactory.java</include>
12771283
<include>src/main/java/org/exist/xquery/Optimizer.java</include>
12781284
<include>src/main/java/org/exist/xquery/UserDefinedFunction.java</include>
1285+
<include>src/main/java/org/exist/xquery/XPathUtil.java</include>
12791286
<include>src/main/java/org/exist/xquery/XQueryContext.java</include>
12801287
<include>src/test/java/org/exist/xquery/XQueryFunctionsTest.java</include>
1288+
<include>src/main/java/org/exist/xquery/functions/array/ArrayType.java</include>
12811289
<include>src/test/java/org/exist/xquery/functions/fn/DocTest.java</include>
12821290
<include>src/main/java/org/exist/xquery/functions/fn/FnModule.java</include>
12831291
<include>src/main/java/org/exist/xquery/functions/fn/FunBaseURI.java</include>
@@ -1288,9 +1296,9 @@
12881296
<include>src/main/java/org/exist/xquery/functions/fn/FunXmlToJson.java</include>
12891297
<include>src/main/java/org/exist/xquery/functions/fn/LoadXQueryModule.java</include>
12901298
<include>src/main/java/org/exist/xquery/functions/fn/ParsingFunctions.java</include>
1291-
<include>src/main/java/org/exist/xquery/functions/system/FunctionAvailable.java</include>
12921299
<include>src/main/java/org/exist/xquery/functions/system/GetUptime.java</include>
12931300
<include>src/main/java/org/exist/xquery/functions/system/Shutdown.java</include>
1301+
<include>src/main/java/org/exist/xquery/functions/system/SystemModule.java</include>
12941302
<include>src/main/java/org/exist/xquery/functions/system/TriggerSystemTask.java</include>
12951303
<include>src/main/java/org/exist/xquery/functions/transform/Transform.java</include>
12961304
<include>src/test/java/org/exist/xquery/functions/transform/TransformFromPkgTest.java</include>
@@ -1304,6 +1312,7 @@
13041312
<include>src/main/java/org/exist/xquery/util/SerializerUtils.java</include>
13051313
<include>src/main/java/org/exist/xquery/value/AbstractDateTimeValue.java</include>
13061314
<include>src/test/java/org/exist/xquery/value/Base64BinaryValueTypeTest.java</include>
1315+
<include>src/main/java/org/exist/xquery/value/SequenceType.java</include>
13071316
<include>src/main/java/org/exist/xquery/value/Type.java</include>
13081317
<include>src/main/java/org/exist/xslt/EXistURIResolver.java</include>
13091318
<include>src/test/resources-filtered/conf.xml</include>
@@ -1689,14 +1698,18 @@
16891698
<exclude>src/test/java/org/exist/xquery/CastExpressionTest.java</exclude>
16901699
<exclude>src/test/java/org/exist/xquery/ConversionsTest.java</exclude>
16911700
<exclude>src/main/java/org/exist/xquery/DecimalFormat.java</exclude>
1701+
<exclude>src/main/java/org/exist/xquery/DynamicTypeCheck.java</exclude>
16921702
<exclude>src/main/java/org/exist/xquery/DynamicVariable.java</exclude>
16931703
<exclude>src/test/java/org/exist/xquery/EmbeddedBinariesTest.java</exclude>
1704+
<exclude>src/main/java/org/exist/xquery/ErrorCodes.java</exclude>
16941705
<exclude>src/main/java/org/exist/xquery/FailTest.java</exclude>
16951706
<exclude>src/main/java/org/exist/xquery/FunctionDSL.java</exclude>
16961707
<exclude>src/main/java/org/exist/xquery/FunctionFactory.java</exclude>
16971708
<exclude>src/test/java/org/exist/xquery/ImportFromPkgTest.java</exclude>
16981709
<exclude>src/test/java/org/exist/xquery/ImportModuleTest.java</exclude>
16991710
<exclude>src/main/java/org/exist/xquery/Intersect.java</exclude>
1711+
<exclude>src/main/java/org/exist/xquery/JavaBinding.java</exclude>
1712+
<exclude>src/test/java/org/exist/xquery/JavaBindingTest.java</exclude>
17001713
<exclude>src/test/java/org/exist/xquery/LocationStepTest.java</exclude>
17011714
<exclude>src/main/java/org/exist/xquery/Materializable.java</exclude>
17021715
<exclude>src/main/java/org/exist/xquery/NameTest.java</exclude>
@@ -1705,10 +1718,12 @@
17051718
<exclude>src/main/java/org/exist/xquery/UserDefinedFunction.java</exclude>
17061719
<exclude>src/main/java/org/exist/xquery/UserSwitchingBasicFunction.java</exclude>
17071720
<exclude>src/test/java/org/exist/xquery/WatchdogTest.java</exclude>
1721+
<exclude>src/main/java/org/exist/xquery/XPathUtil.java</exclude>
17081722
<exclude>src/main/java/org/exist/xquery/XQueryContext.java</exclude>
17091723
<exclude>src/test/java/org/exist/xquery/XQueryContextAttributesTest.java</exclude>
17101724
<exclude>src/test/java/org/exist/xquery/XQueryFunctionsTest.java</exclude>
17111725
<exclude>src/test/java/org/exist/xquery/XQueryIsLibraryModuleTest.java</exclude>
1726+
<exclude>src/main/java/org/exist/xquery/functions/array/ArrayType.java</exclude>
17121727
<exclude>src/test/java/org/exist/xquery/functions/fn/DocTest.java</exclude>
17131728
<exclude>src/main/java/org/exist/xquery/functions/fn/FnDefaultLanguage.java</exclude>
17141729
<exclude>src/main/java/org/exist/xquery/functions/fn/FnFormatIntegers.java</exclude>
@@ -1763,6 +1778,7 @@
17631778
<exclude>src/test/java/org/exist/xquery/functions/system/GetRunningXQueriesTest.java</exclude>
17641779
<exclude>src/main/java/org/exist/xquery/functions/system/GetUptime.java</exclude>
17651780
<exclude>src/main/java/org/exist/xquery/functions/system/Shutdown.java</exclude>
1781+
<exclude>src/main/java/org/exist/xquery/functions/system/SystemModule.java</exclude>
17661782
<exclude>src/main/java/org/exist/xquery/functions/system/TriggerSystemTask.java</exclude>
17671783
<exclude>src/main/java/org/exist/xquery/functions/transform/Transform.java</exclude>
17681784
<exclude>src/test/java/org/exist/xquery/functions/transform/TransformFromPkgTest.java</exclude>
@@ -1799,6 +1815,7 @@
17991815
<exclude>src/test/java/org/exist/xquery/value/MockBinaryValueManager.java</exclude>
18001816
<exclude>src/test/java/org/exist/xquery/value/OrderedValueSequenceTest.java</exclude>
18011817
<exclude>src/main/java/org/exist/xquery/value/SequenceComparator.java</exclude>
1818+
<exclude>src/main/java/org/exist/xquery/value/SequenceType.java</exclude>
18021819
<exclude>src/test/java/org/exist/xquery/value/SingleItemIteratorTest.java</exclude>
18031820
<exclude>src/main/java/org/exist/xquery/value/SubSequence.java</exclude>
18041821
<exclude>src/test/java/org/exist/xquery/value/SubSequenceRangeTest.java</exclude>
@@ -1813,6 +1830,7 @@
18131830
<exclude>src/main/resources-filtered/org/exist/system.properties</exclude>
18141831
<exclude>src/test/resources-filtered/org/exist/xquery/functions/transform/transform-from-pkg-test.conf.xml</exclude>
18151832
<exclude>src/test/resources-filtered/org/exist/xquery/import-from-pkg-test.conf.xml</exclude>
1833+
<exclude>src/test/resources-filtered/org/exist/xquery/JavaBindingTest.conf.xml</exclude>
18161834
<exclude>src/test/resources/**/*.bin</exclude>
18171835
<exclude>src/test/resources/**/*.xar</exclude>
18181836
<exclude>src/test/resources/collection.xconf.init</exclude>

exist-core/src/main/java/org/exist/util/Configuration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@
232232
import static org.exist.xquery.FunctionFactory.DISABLE_DEPRECATED_FUNCTIONS_ATTRIBUTE;
233233
import static org.exist.xquery.FunctionFactory.DISABLE_DEPRECATED_FUNCTIONS_BY_DEFAULT;
234234
import static org.exist.xquery.FunctionFactory.ENABLE_JAVA_BINDING_ATTRIBUTE;
235+
import static org.exist.xquery.FunctionFactory.ENABLE_JAVA_BINDING_BY_DEFAULT;
235236
import static org.exist.xquery.FunctionFactory.PROPERTY_DISABLE_DEPRECATED_FUNCTIONS;
236237
import static org.exist.xquery.FunctionFactory.PROPERTY_ENABLE_JAVA_BINDING;
237238
import static org.exist.xquery.XQueryContext.BUILT_IN_MODULE_CLASS_ATTRIBUTE;
@@ -547,7 +548,7 @@ private void configureBinaryManager(final Element binaryManager) throws Database
547548

548549
private void configureXQuery(final Element xquery) throws DatabaseConfigurationException {
549550
//java binding
550-
configureProperty(xquery, ENABLE_JAVA_BINDING_ATTRIBUTE, PROPERTY_ENABLE_JAVA_BINDING);
551+
configureProperty(xquery, ENABLE_JAVA_BINDING_ATTRIBUTE, PROPERTY_ENABLE_JAVA_BINDING, Configuration::asBoolean, ENABLE_JAVA_BINDING_BY_DEFAULT);
551552
configureProperty(xquery, DISABLE_DEPRECATED_FUNCTIONS_ATTRIBUTE, PROPERTY_DISABLE_DEPRECATED_FUNCTIONS, Configuration::asBoolean, DISABLE_DEPRECATED_FUNCTIONS_BY_DEFAULT);
552553
configureProperty(xquery, ENABLE_QUERY_REWRITING_ATTRIBUTE, PROPERTY_ENABLE_QUERY_REWRITING);
553554
configureProperty(xquery, ENFORCE_INDEX_USE_ATTRIBUTE, PROPERTY_ENFORCE_INDEX_USE);

exist-core/src/main/java/org/exist/xquery/Cardinality.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,20 @@ public static Cardinality fromInt(final int intValue) {
179179
throw new IllegalArgumentException("No know cardinality for intValue: " + intValue);
180180
}
181181

182+
/**
183+
* Compare this Cardinality to another Cardinality.
184+
*
185+
* NOTE we can't implement (override) {@link Comparable#compareTo(Object)}
186+
* here as it is final in {@link java.lang.Enum}.
187+
*
188+
* @param other the other Cardinality to be compared.
189+
*
190+
* @return a negative integer, zero, or a positive integer as this Cardinality is less than, equal to, or greater than the other Cardinality.
191+
*/
192+
public int compare(final Cardinality other) {
193+
return Byte.compare(val, other.val);
194+
}
195+
182196
static class InternalValue {
183197
static final byte ZERO = 1;
184198
static final byte ONE = 2;

exist-core/src/main/java/org/exist/xquery/DynamicTypeCheck.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,31 @@
11
/*
2+
* Elemental
3+
* Copyright (C) 2024, Evolved Binary Ltd
4+
*
5+
6+
* https://www.evolvedbinary.com | https://www.elemental.xyz
7+
*
8+
* Use of this software is governed by the Business Source License 1.1
9+
* included in the LICENSE file and at www.mariadb.com/bsl11.
10+
*
11+
* Change Date: 2028-04-27
12+
*
13+
* On the date above, in accordance with the Business Source License, use
14+
* of this software will be governed by the Apache License, Version 2.0.
15+
*
16+
* Additional Use Grant: Production use of the Licensed Work for a permitted
17+
* purpose. A Permitted Purpose is any purpose other than a Competing Use.
18+
* A Competing Use means making the Software available to others in a commercial
19+
* product or service that: substitutes for the Software; substitutes for any
20+
* other product or service we offer using the Software that exists as of the
21+
* date we make the Software available; or offers the same or substantially
22+
* similar functionality as the Software.
23+
*
24+
* NOTE: Parts of this file contain code from 'The eXist-db Authors'.
25+
* The original license header is included below.
26+
*
27+
* =====================================================================
28+
*
229
* eXist-db Open Source Native XML Database
330
* Copyright (C) 2001 The eXist-db Authors
431
*
@@ -82,6 +109,9 @@ private void check(Sequence result, Item item) throws XPathException {
82109
//Retrieve the actual node
83110
{type= ((NodeProxy) item).getNode().getNodeType();}
84111
}
112+
if (requiredType == Type.JAVA_OBJECT) {
113+
type = Type.JAVA_OBJECT;
114+
}
85115
if(type != requiredType && !Type.subTypeOf(type, requiredType)) {
86116
//TODO : how to make this block more generic ? -pb
87117
if (type == Type.UNTYPED_ATOMIC) {

exist-core/src/main/java/org/exist/xquery/ErrorCodes.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,31 @@
11
/*
2+
* Elemental
3+
* Copyright (C) 2024, Evolved Binary Ltd
4+
*
5+
6+
* https://www.evolvedbinary.com | https://www.elemental.xyz
7+
*
8+
* Use of this software is governed by the Business Source License 1.1
9+
* included in the LICENSE file and at www.mariadb.com/bsl11.
10+
*
11+
* Change Date: 2028-04-27
12+
*
13+
* On the date above, in accordance with the Business Source License, use
14+
* of this software will be governed by the Apache License, Version 2.0.
15+
*
16+
* Additional Use Grant: Production use of the Licensed Work for a permitted
17+
* purpose. A Permitted Purpose is any purpose other than a Competing Use.
18+
* A Competing Use means making the Software available to others in a commercial
19+
* product or service that: substitutes for the Software; substitutes for any
20+
* other product or service we offer using the Software that exists as of the
21+
* date we make the Software available; or offers the same or substantially
22+
* similar functionality as the Software.
23+
*
24+
* NOTE: Parts of this file contain code from 'The eXist-db Authors'.
25+
* The original license header is included below.
26+
*
27+
* =====================================================================
28+
*
229
* eXist-db Open Source Native XML Database
330
* Copyright (C) 2001 The eXist-db Authors
431
*
@@ -262,6 +289,10 @@ public class ErrorCodes {
262289
public static final ErrorCode EXXQDY0005 = new EXistErrorCode("EXXQDY0005", "No function call details were provided when trying to execute a Library Module.");
263290
public static final ErrorCode EXXQDY0006 = new EXistErrorCode("EXXQDY0006", "Unable to find named function when trying to execute a Library Module.");
264291

292+
public static final ErrorCode EXXQST0001 = new EXistErrorCode("EXXQST0001", "Java binding is disabled in the current configuration.");
293+
public static final ErrorCode EXXQST0002 = new EXistErrorCode("EXXQST0002", "No Java binding possible for the indicated Java class.");
294+
public static final ErrorCode EXXQST0003 = new EXistErrorCode("EXXQST0003", "No Java binding possible for the indicated Java field/method.");
295+
265296
public static final ErrorCode ERROR = new EXistErrorCode("ERROR", "Error.");
266297

267298
public static class ErrorCode {
@@ -309,12 +340,12 @@ private EXistErrorCode(String code, String description) {
309340

310341
public static class JavaErrorCode extends ErrorCode {
311342

312-
public JavaErrorCode(Throwable throwable) {
343+
public JavaErrorCode(final Throwable throwable) {
313344
super(new QName(
314345
throwable.getClass().getName(),
315346
Namespaces.EXIST_JAVA_BINDING_NS,
316347
Namespaces.EXIST_JAVA_BINDING_NS_PREFIX),
317-
throwable.getMessage());
348+
throwable.getMessage() != null ? throwable.getMessage() : throwable.getCause().getMessage());
318349
}
319350
}
320351
}

0 commit comments

Comments
 (0)