aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--document/src/main/java/com/yahoo/document/datatypes/StringFieldValue.java13
-rw-r--r--document/src/main/java/com/yahoo/document/idstring/IdString.java7
-rw-r--r--vespajlib/src/main/java/com/yahoo/text/Text.java17
3 files changed, 25 insertions, 12 deletions
diff --git a/document/src/main/java/com/yahoo/document/datatypes/StringFieldValue.java b/document/src/main/java/com/yahoo/document/datatypes/StringFieldValue.java
index de96c548652..51b068b4712 100644
--- a/document/src/main/java/com/yahoo/document/datatypes/StringFieldValue.java
+++ b/document/src/main/java/com/yahoo/document/datatypes/StringFieldValue.java
@@ -17,7 +17,7 @@ import com.yahoo.vespa.objects.Ids;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
-import java.util.OptionalInt;
+import java.util.Objects;
/**
* A StringFieldValue is a wrapper class that holds a String in {@link com.yahoo.document.Document}s and
@@ -57,10 +57,9 @@ public class StringFieldValue extends FieldValue {
}
private static void validateTextString(String value) {
- OptionalInt illegalCodePoint = Text.validateTextString(value);
- if (illegalCodePoint.isPresent()) {
+ if ( ! Text.isValidTextString(value)) {
throw new IllegalArgumentException("The string field value contains illegal code point 0x" +
- Integer.toHexString(illegalCodePoint.getAsInt()).toUpperCase());
+ Integer.toHexString(Text.validateTextString(value).getAsInt()).toUpperCase());
}
}
@@ -88,7 +87,7 @@ public class StringFieldValue extends FieldValue {
public StringFieldValue clone() {
StringFieldValue strfval = (StringFieldValue) super.clone();
if (spanTrees != null) {
- strfval.spanTrees = new HashMap<String, SpanTree>(spanTrees.size());
+ strfval.spanTrees = new HashMap<>(spanTrees.size());
for (Map.Entry<String, SpanTree> entry : spanTrees.entrySet()) {
strfval.spanTrees.put(entry.getKey(), new SpanTree(entry.getValue()));
}
@@ -240,8 +239,8 @@ public class StringFieldValue extends FieldValue {
if (!(o instanceof StringFieldValue)) return false;
if (!super.equals(o)) return false;
StringFieldValue that = (StringFieldValue) o;
- if ((spanTrees != null) ? !spanTrees.equals(that.spanTrees) : that.spanTrees != null) return false;
- if ((value != null) ? !value.equals(that.value) : that.value != null) return false;
+ if (!Objects.equals(spanTrees, that.spanTrees)) return false;
+ if (!Objects.equals(value, that.value)) return false;
return true;
}
diff --git a/document/src/main/java/com/yahoo/document/idstring/IdString.java b/document/src/main/java/com/yahoo/document/idstring/IdString.java
index 55beff9eef9..82a01377b6c 100644
--- a/document/src/main/java/com/yahoo/document/idstring/IdString.java
+++ b/document/src/main/java/com/yahoo/document/idstring/IdString.java
@@ -5,8 +5,6 @@ import com.yahoo.api.annotations.Beta;
import com.yahoo.text.Text;
import com.yahoo.text.Utf8String;
-import java.util.OptionalInt;
-
/**
* To be used with DocumentId constructor.
*
@@ -81,10 +79,9 @@ public abstract class IdString {
}
private static void validateTextString(String id) {
- OptionalInt illegalCodePoint = Text.validateTextString(id);
- if (illegalCodePoint.isPresent()) {
+ if (Text.isValidTextString(id)) {
throw new IllegalArgumentException("Unparseable id '" + id + "': Contains illegal code point 0x" +
- Integer.toHexString(illegalCodePoint.getAsInt()).toUpperCase());
+ Integer.toHexString(Text.validateTextString(id).getAsInt()).toUpperCase());
}
}
diff --git a/vespajlib/src/main/java/com/yahoo/text/Text.java b/vespajlib/src/main/java/com/yahoo/text/Text.java
index 662100aa8ea..be34a9e3ab0 100644
--- a/vespajlib/src/main/java/com/yahoo/text/Text.java
+++ b/vespajlib/src/main/java/com/yahoo/text/Text.java
@@ -110,6 +110,23 @@ public final class Text {
return OptionalInt.empty();
}
+ /**
+ * Validates that the given string value only contains text characters.
+ */
+ public static boolean isValidTextString(String string) {
+ for (int i = 0; i < string.length(); ) {
+ int codePoint = string.codePointAt(i);
+ if ( ! Text.isTextCharacter(codePoint)) return false;
+
+ int charCount = Character.charCount(codePoint);
+ if (Character.isHighSurrogate(string.charAt(i))) {
+ if ( (charCount == 1) || !Character.isLowSurrogate(string.charAt(i+1))) return false;
+ }
+ i += charCount;
+ }
+ return true;
+ }
+
/** Returns whether the given code point is displayable. */
public static boolean isDisplayable(int codePoint) {
switch (Character.getType(codePoint)) {