Skip to content

Commit e98f87b

Browse files
committed
[bugfix] Correct type conversions for fields in the Lucene Full Text Index
The issues were previously introduced in eXist-db/exist#4253 and eXist-db/exist#4541 Closes eXist-db/exist#5193
1 parent 4cedff9 commit e98f87b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+5056
-525
lines changed

exist-core/pom.xml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,13 @@
690690
<include>src/main/java/org/exist/dom/memtree/reference/ElementReferenceImpl.java</include>
691691
<include>src/main/java/org/exist/dom/memtree/reference/ProcessingInstructionReferenceImpl.java</include>
692692
<include>src/main/java/org/exist/dom/memtree/reference/TextReferenceImpl.java</include>
693+
<include>src/main/java/org/exist/storage/io/AbstractVariableByteOutput.java</include>
694+
<include>src/main/java/org/exist/storage/io/VariableByteArrayOutputStream.java</include>
695+
<include>src/main/java/org/exist/storage/io/VariableByteBufferInput.java</include>
696+
<include>src/main/java/org/exist/storage/io/VariableByteBufferOutput.java</include>
697+
<include>src/main/java/org/exist/storage/io/VariableByteFilterInputStream.java</include>
698+
<include>src/main/java/org/exist/storage/io/VariableByteFilterOutputStream.java</include>
699+
<include>src/main/java/org/exist/storage/io/VariableByteOutput.java</include>
693700
<include>src/main/java/org/exist/util/ByteOrderMark.java</include>
694701
<include>src/main/java/org/exist/util/JREUtil.java</include>
695702
<include>src/main/java/org/exist/util/OSUtil.java</include>
@@ -779,6 +786,7 @@
779786
<include>src/main/java/org/exist/config/ConfigurationImpl.java</include>
780787
<include>src/main/java/org/exist/config/Configurator.java</include>
781788
<include>src/main/java/org/exist/dom/NodeListImpl.java</include>
789+
<include>src/main/java/org/exist/dom/QName.java</include>
782790
<exclude>src/main/java/org/exist/dom/memtree/AbstractCharacterData.java</exclude>
783791
<include>src/main/java/org/exist/dom/memtree/AttrImpl.java</include>
784792
<include>src/main/java/org/exist/dom/memtree/DocumentImpl.java</include>
@@ -997,7 +1005,28 @@
9971005
<include>src/main/java/org/exist/xquery/util/ExpressionDumper.java</include>
9981006
<include>src/main/java/org/exist/xquery/util/SerializerUtils.java</include>
9991007
<include>src/main/java/org/exist/xquery/value/AbstractDateTimeValue.java</include>
1008+
<include>src/main/java/org/exist/xquery/value/AnyURIValue.java</include>
10001009
<include>src/test/java/org/exist/xquery/value/Base64BinaryValueTypeTest.java</include>
1010+
<include>src/main/java/org/exist/xquery/value/BinaryValue.java</include>
1011+
<include>src/main/java/org/exist/xquery/value/BooleanValue.java</include>
1012+
<include>src/main/java/org/exist/xquery/value/DateTimeStampValue.java</include>
1013+
<include>src/main/java/org/exist/xquery/value/DateTimeValue.java</include>
1014+
<include>src/main/java/org/exist/xquery/value/DateValue.java</include>
1015+
<include>src/main/java/org/exist/xquery/value/DayTimeDurationValue.java</include>
1016+
<include>src/main/java/org/exist/xquery/value/DecimalValue.java</include>
1017+
<include>src/main/java/org/exist/xquery/value/DoubleValue.java</include>
1018+
<include>src/main/java/org/exist/xquery/value/DurationValue.java</include>
1019+
<include>src/main/java/org/exist/xquery/value/FloatValue.java</include>
1020+
<include>src/main/java/org/exist/xquery/value/GDayValue.java</include>
1021+
<include>src/main/java/org/exist/xquery/value/GMonthDayValue.java</include>
1022+
<include>src/main/java/org/exist/xquery/value/GMonthValue.java</include>
1023+
<include>src/main/java/org/exist/xquery/value/GYearMonthValue.java</include>
1024+
<include>src/main/java/org/exist/xquery/value/GYearValue.java</include>
1025+
<include>src/main/java/org/exist/xquery/value/IntegerValue.java</include>
1026+
<include>src/main/java/org/exist/xquery/value/QNameValue.java</include>
1027+
<include>src/main/java/org/exist/xquery/value/StringValue.java</include>
1028+
<include>src/main/java/org/exist/xquery/value/TimeValue.java</include>
1029+
<include>src/main/java/org/exist/xquery/value/YearMonthDurationValue.java</include>
10011030
<include>src/main/java/org/exist/xquery/value/SequenceType.java</include>
10021031
<include>src/main/java/org/exist/xquery/value/TimeUtils.java</include>
10031032
<include>src/main/java/org/exist/xquery/value/Type.java</include>
@@ -1085,6 +1114,7 @@
10851114
<exclude>src/main/java/org/exist/config/ConfigurationImpl.java</exclude>
10861115
<exclude>src/main/java/org/exist/config/Configurator.java</exclude>
10871116
<exclude>src/main/java/org/exist/dom/NodeListImpl.java</exclude>
1117+
<exclude>src/main/java/org/exist/dom/QName.java</exclude>
10881118
<exclude>src/main/java/org/exist/dom/memtree/AbstractCharacterData.java</exclude>
10891119
<exclude>src/main/java/org/exist/dom/memtree/AttrImpl.java</exclude>
10901120
<exclude>src/main/java/org/exist/dom/memtree/DocumentImpl.java</exclude>
@@ -1220,6 +1250,8 @@
12201250
<exclude>src/main/java/org/exist/storage/io/AbstractVariableByteOutput.java</exclude>
12211251
<exclude>src/main/java/org/exist/storage/io/VariableByteArrayInput.java</exclude>
12221252
<exclude>src/main/java/org/exist/storage/io/VariableByteArrayOutputStream.java</exclude>
1253+
<exclude>src/main/java/org/exist/storage/io/VariableByteBufferInput.java</exclude>
1254+
<exclude>src/main/java/org/exist/storage/io/VariableByteBufferOutput.java</exclude>
12231255
<exclude>src/main/java/org/exist/storage/io/VariableByteFilterInputStream.java</exclude>
12241256
<exclude>src/main/java/org/exist/storage/io/VariableByteFilterOutputStream.java</exclude>
12251257
<exclude>src/main/java/org/exist/storage/io/VariableByteInput.java</exclude>
@@ -1402,19 +1434,40 @@
14021434
<exclude>src/main/java/org/exist/xquery/util/SerializerUtils.java</exclude>
14031435
<exclude>src/test/java/org/exist/xquery/util/URIUtilsTest.java</exclude>
14041436
<exclude>src/main/java/org/exist/xquery/value/AbstractDateTimeValue.java</exclude>
1437+
<exclude>src/main/java/org/exist/xquery/value/AnyURIValue.java</exclude>
14051438
<exclude>src/main/java/org/exist/xquery/value/ArrayListValueSequence.java</exclude>
14061439
<exclude>src/main/java/org/exist/xquery/value/AtomicValueComparator.java</exclude>
14071440
<exclude>src/test/java/org/exist/xquery/value/Base64BinaryValueTypeTest.java</exclude>
14081441
<exclude>src/test/java/org/exist/xquery/value/BifurcanMapTest.java</exclude>
1442+
<exclude>src/main/java/org/exist/xquery/value/BinaryValue.java</exclude>
1443+
<exclude>src/main/java/org/exist/xquery/value/BooleanValue.java</exclude>
1444+
<exclude>src/main/java/org/exist/xquery/value/DateTimeStampValue.java</exclude>
14091445
<exclude>src/test/java/org/exist/xquery/value/DateTimeTypesTest.java</exclude>
1446+
<exclude>src/main/java/org/exist/xquery/value/DateTimeValue.java</exclude>
1447+
<exclude>src/main/java/org/exist/xquery/value/DateValue.java</exclude>
1448+
<exclude>src/main/java/org/exist/xquery/value/DayTimeDurationValue.java</exclude>
1449+
<exclude>src/main/java/org/exist/xquery/value/DecimalValue.java</exclude>
1450+
<exclude>src/main/java/org/exist/xquery/value/DoubleValue.java</exclude>
1451+
<exclude>src/main/java/org/exist/xquery/value/DurationValue.java</exclude>
1452+
<exclude>src/main/java/org/exist/xquery/value/FloatValue.java</exclude>
1453+
<exclude>src/main/java/org/exist/xquery/value/GDayValue.java</exclude>
1454+
<exclude>src/main/java/org/exist/xquery/value/GMonthDayValue.java</exclude>
1455+
<exclude>src/main/java/org/exist/xquery/value/GMonthValue.java</exclude>
1456+
<exclude>src/main/java/org/exist/xquery/value/GYearMonthValue.java</exclude>
1457+
<exclude>src/main/java/org/exist/xquery/value/GYearValue.java</exclude>
1458+
<exclude>src/main/java/org/exist/xquery/value/IntegerValue.java</exclude>
14101459
<exclude>src/main/java/org/exist/xquery/value/ItemComparator.java</exclude>
1460+
<exclude>src/main/java/org/exist/xquery/value/QNameValue.java</exclude>
14111461
<exclude>src/main/java/org/exist/xquery/value/SequenceComparator.java</exclude>
14121462
<exclude>src/main/java/org/exist/xquery/value/SequenceType.java</exclude>
1463+
<exclude>src/main/java/org/exist/xquery/value/StringValue.java</exclude>
14131464
<exclude>src/main/java/org/exist/xquery/value/SubSequence.java</exclude>
14141465
<exclude>src/test/java/org/exist/xquery/value/SubSequenceRangeTest.java</exclude>
14151466
<exclude>src/test/java/org/exist/xquery/value/SubSequenceTest.java</exclude>
1467+
<exclude>src/main/java/org/exist/xquery/value/TimeValue.java</exclude>
14161468
<exclude>src/main/java/org/exist/xquery/value/TimeUtils.java</exclude>
14171469
<exclude>src/main/java/org/exist/xquery/value/Type.java</exclude>
1470+
<exclude>src/main/java/org/exist/xquery/value/YearMonthDurationValue.java</exclude>
14181471
<exclude>src/main/java/org/exist/xslt/EXistURIResolver.java</exclude>
14191472
<exclude>src/main/java/org/exist/xslt/XsltURIResolverHelper.java</exclude>
14201473
<exclude>src/test/java/org/exist/xupdate/RemoveAppendTest.java</exclude>

exist-core/src/main/java/org/exist/dom/QName.java

Lines changed: 99 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,28 @@
11
/*
2+
* Elemental
3+
* Copyright (C) 2024, Evolved Binary Ltd
4+
*
5+
6+
* https://www.evolvedbinary.com | https://www.elemental.xyz
7+
*
8+
* This library is free software; you can redistribute it and/or
9+
* modify it under the terms of the GNU Lesser General Public
10+
* License as published by the Free Software Foundation; version 2.1.
11+
*
12+
* This library is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15+
* Lesser General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU Lesser General Public
18+
* License along with this library; if not, write to the Free Software
19+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20+
*
21+
* NOTE: Parts of this file contain code from 'The eXist-db Authors'.
22+
* The original license header is included below.
23+
*
24+
* =====================================================================
25+
*
226
* eXist-db Open Source Native XML Database
327
* Copyright (C) 2001 The eXist-db Authors
428
*
@@ -26,16 +50,19 @@
2650
import org.exist.util.XMLNames;
2751
import org.exist.xquery.Constants;
2852

53+
import javax.annotation.Nullable;
2954
import javax.xml.XMLConstants;
3055
import java.util.regex.Matcher;
3156
import java.util.regex.Pattern;
3257

3358
import static org.exist.dom.QName.Validity.*;
59+
import static org.exist.util.StringUtil.isNullOrEmpty;
3460

3561
/**
3662
* Represents a QName, consisting of a local name, a namespace URI and a prefix.
3763
*
3864
* @author <a href="mailto:[email protected]">Wolfgang</a>
65+
* @author <a href="mailto:[email protected]">Adam Retter</a>
3966
*/
4067
public class QName implements Comparable<QName> {
4168

@@ -136,7 +163,18 @@ public byte getNameType() {
136163
* @return the string representation of this qualified name.
137164
* */
138165
public String getStringValue() {
139-
return getStringRepresentation(false);
166+
return getStringRepresentation(false, false);
167+
}
168+
169+
/**
170+
* Get an extended string representation of this qualified name.
171+
*
172+
* Will be of the format `local-name`, `{namespace}local-name`, or `{namespace}prefix:local-name`.
173+
*
174+
* @return the string representation of this qualified name.
175+
*/
176+
public String getExtendedStringValue() {
177+
return getStringRepresentation(false, true);
140178
}
141179

142180
/**
@@ -148,23 +186,32 @@ public String getStringValue() {
148186
*/
149187
@Override
150188
public String toString() {
151-
return getStringRepresentation(true);
189+
return getStringRepresentation(true, false);
152190
}
153191

154192
/**
155193
* Get a string representation of this qualified name.
156194
*
157195
* @param showNsWithoutPrefix true if the namespace should be shown even when there is no prefix, false otherwise.
158-
* When shown, it will be output using Clark notation, e.g. `{http://namespace}local-name`.
196+
* When shown, it will be output using Clark notation, e.g. `{namespace}local-name`.
197+
*
198+
* @param extended true if the namespace and prefix should be shown, requires showNsWithoutPrefix == false.
159199
*
160200
* @return the string representation of this qualified name.
161201
*/
162-
private String getStringRepresentation(final boolean showNsWithoutPrefix) {
202+
private String getStringRepresentation(final boolean showNsWithoutPrefix, final boolean extended) {
163203
if (prefix != null && !prefix.isEmpty()) {
164-
return prefix + COLON + localPart;
165-
} else if (showNsWithoutPrefix && namespaceURI != null && !XMLConstants.NULL_NS_URI.equals(namespaceURI)) {
204+
if (extended) {
205+
return LEFT_BRACE + namespaceURI + RIGHT_BRACE + prefix + COLON + localPart;
206+
} else {
207+
return prefix + COLON + localPart;
208+
}
209+
}
210+
211+
if (showNsWithoutPrefix && namespaceURI != null && !XMLConstants.NULL_NS_URI.equals(namespaceURI)) {
166212
return LEFT_BRACE + namespaceURI + RIGHT_BRACE + localPart;
167213
}
214+
168215
return localPart;
169216
}
170217

@@ -343,6 +390,52 @@ public static QName parse(final String namespaceURI, final String qname) throws
343390
private final static Pattern ptnClarkNotation = Pattern.compile("\\{([^&{}]*)\\}([^&{}:]+)");
344391
private final static Pattern ptnEqNameNotation = Pattern.compile("Q" + ptnClarkNotation);
345392

393+
/**
394+
* Extract a QName from a namespace and qualified name string.
395+
*
396+
* @param extendedStringValue a string representation as produced by {@link #getExtendedStringValue()}, i.e.: `local-name`, `{namespace}local-name`, or `{namespace}prefix:local-name`.
397+
* @return The QName
398+
* @throws IllegalQNameException if the qname component is invalid
399+
*/
400+
public static QName parse(String extendedStringValue) throws IllegalQNameException {
401+
if (isNullOrEmpty(extendedStringValue)) {
402+
throw new IllegalQNameException(ILLEGAL_FORMAT.val, "Illegal extended string QName is empty");
403+
}
404+
405+
final String namespaceUri;
406+
if (extendedStringValue.charAt(0) == LEFT_BRACE) {
407+
final int idxNsEnd = extendedStringValue.indexOf(RIGHT_BRACE);
408+
if (idxNsEnd == Constants.STRING_NOT_FOUND) {
409+
throw new IllegalQNameException(ILLEGAL_FORMAT.val, "Illegal extended string QName, missing right brace: '" + extendedStringValue + "'");
410+
}
411+
namespaceUri = extendedStringValue.substring(1, idxNsEnd);
412+
extendedStringValue = extendedStringValue.substring(idxNsEnd + 1);
413+
} else if (extendedStringValue.indexOf(RIGHT_BRACE) != Constants.STRING_NOT_FOUND) {
414+
throw new IllegalQNameException(ILLEGAL_FORMAT.val, "Illegal extended string QName, missing left brace: '" + extendedStringValue + "'");
415+
} else {
416+
namespaceUri = XMLConstants.NULL_NS_URI;
417+
}
418+
419+
@Nullable final String prefix;
420+
final int idxColon = extendedStringValue.indexOf(COLON);
421+
if (idxColon == Constants.STRING_NOT_FOUND) {
422+
prefix = null;
423+
} else {
424+
prefix = extendedStringValue.substring(0, idxColon);
425+
if (!XMLNames.isNCName(prefix)) {
426+
throw new IllegalQNameException(INVALID_PREFIX.val, "Illegal extended string QName, invalid prefix: '" + extendedStringValue + "'");
427+
}
428+
extendedStringValue = extendedStringValue.substring(idxColon + 1);
429+
}
430+
431+
final String localPart = extendedStringValue;
432+
if (!XMLNames.isNCName(localPart)) {
433+
throw new IllegalQNameException(INVALID_LOCAL_PART.val, "Illegal extended string QName, invalid prefix: '" + extendedStringValue + "'");
434+
}
435+
436+
return new QName(localPart, namespaceUri, prefix);
437+
}
438+
346439
/**
347440
* Parses the given string into a QName. The method uses context to look up
348441
* a namespace URI for an existing prefix.

exist-core/src/main/java/org/exist/dom/persistent/ElementImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import org.exist.xquery.value.StringValue;
7676
import org.w3c.dom.*;
7777

78+
import javax.annotation.Nullable;
7879
import javax.xml.XMLConstants;
7980
import javax.xml.stream.XMLStreamConstants;
8081
import javax.xml.stream.XMLStreamException;
@@ -1387,6 +1388,10 @@ public String getNamespaceForPrefix(final String prefix) {
13871388
return namespaceMappings.get(prefix);
13881389
}
13891390

1391+
public @Nullable Map<String, String> getNamespaceMappings() {
1392+
return namespaceMappings;
1393+
}
1394+
13901395
/**
13911396
* @see java.lang.Object#toString()
13921397
*/

0 commit comments

Comments
 (0)