This is an automated email from the ASF dual-hosted git repository.
gitgabrio pushed a commit to branch 7.67.x-blue
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git
The following commit(s) were added to refs/heads/7.67.x-blue by this push:
new ba0b36ec8e [7.67.x-incubator-kie-issues#1382] Backport (#6022)
ba0b36ec8e is described below
commit ba0b36ec8e858bb11bb7486a1fad1d81673ba0f6
Author: Gabriele Cardosi <[email protected]>
AuthorDate: Thu Jul 11 14:55:02 2024 +0200
[7.67.x-incubator-kie-issues#1382] Backport (#6022)
Co-authored-by: Gabriele-Cardosi <[email protected]>
---
.../java/org/drools/core/util/StringUtils.java | 22 ++++-
.../java/org/drools/core/util/StringUtilsTest.java | 105 +++++++++++++++++++++
2 files changed, 125 insertions(+), 2 deletions(-)
diff --git a/drools-core/src/main/java/org/drools/core/util/StringUtils.java
b/drools-core/src/main/java/org/drools/core/util/StringUtils.java
index 78794ddb1b..f443523174 100644
--- a/drools-core/src/main/java/org/drools/core/util/StringUtils.java
+++ b/drools-core/src/main/java/org/drools/core/util/StringUtils.java
@@ -976,8 +976,23 @@ public class StringUtils {
return builder.toString();
}
+ /**
+ * Method that tries to extract <b>identifiers</b> from a Srting.
+ * First, it tries to identify "quoted" part, that should be ignored.
+ * Then, it tries to extract a String that is valid as java identifier.
+ * If an identifier is found, returns the last index of the identifier
itself, otherwise the length of the string itself
+ *
+ * {@link Character#isJavaIdentifierStart}
+ * {@link Character#isJavaIdentifierPart}
+ * @param string
+ * @param builder
+ * @param start
+ * @return
+ */
public static int extractFirstIdentifier(String string, StringBuilder
builder, int start) {
boolean isQuoted = false;
+ boolean isDoubleQuoted = false;
+ boolean isSingleQuoted = false;
boolean started = false;
int i = start;
for (; i < string.length(); i++) {
@@ -985,13 +1000,16 @@ public class StringUtils {
if (!isQuoted && Character.isJavaIdentifierStart(ch)) {
builder.append(ch);
started = true;
- } else if (ch == '"' || ch == '\'') {
- isQuoted = !isQuoted;
+ } else if (ch == '"') {
+ isDoubleQuoted = !isQuoted && !isDoubleQuoted;
+ } else if (ch == '\'') {
+ isSingleQuoted = !isQuoted && !isSingleQuoted;
} else if (started && Character.isJavaIdentifierPart(ch)) {
builder.append(ch);
} else if (started) {
break;
}
+ isQuoted = isDoubleQuoted || isSingleQuoted;
}
return i;
}
diff --git
a/drools-core/src/test/java/org/drools/core/util/StringUtilsTest.java
b/drools-core/src/test/java/org/drools/core/util/StringUtilsTest.java
index 60edd44f67..ebacf27a9a 100644
--- a/drools-core/src/test/java/org/drools/core/util/StringUtilsTest.java
+++ b/drools-core/src/test/java/org/drools/core/util/StringUtilsTest.java
@@ -298,6 +298,111 @@ public class StringUtilsTest {
}
}
+ @Test
+ public void testExtractFirstIdentifierWithStringBuilder() {
+ // Not-quoted string, interpreted as identifier
+ String string = "IDENTIFIER";
+ String expected = string;
+ StringBuilder builder = new StringBuilder();
+ int start = 0;
+ int retrieved = StringUtils.extractFirstIdentifier(string, builder,
start);
+ assertThat(retrieved).isEqualTo(string.length()); // retrieved size is
equals to the length of given string
+ assertThat(builder.toString()).isEqualTo(expected);
+
+ // Quoted string, not interpreted as identifier
+ string = "\"IDENTIFIER\"";
+ expected = "";
+ builder = new StringBuilder();
+ retrieved = StringUtils.extractFirstIdentifier(string, builder, start);
+ assertThat(retrieved).isEqualTo(string.length());
+ assertThat(builder.toString()).isEqualTo(expected);
+
+ // Only the not-quoted string, and its size, is returned
+ string = "IDENTIFIER \"";
+ expected = "IDENTIFIER";
+ builder = new StringBuilder();
+ retrieved = StringUtils.extractFirstIdentifier(string, builder, start);
+ assertThat(retrieved).isEqualTo(expected.length()); // it returns the
index where the identifier ends
+ assertThat(builder.toString()).isEqualTo(expected);
+
+ string = "IDENTIFIER \"the_identifier";
+ expected = "IDENTIFIER";
+ builder = new StringBuilder();
+ retrieved = StringUtils.extractFirstIdentifier(string, builder, start);
+ assertThat(retrieved).isEqualTo(expected.length()); // it returns the
index where the identifier ends
+ assertThat(builder.toString()).isEqualTo(expected);
+
+ string = "\"the_identifier\" IDENTIFIER";
+ expected = "IDENTIFIER";
+ builder = new StringBuilder();
+ retrieved = StringUtils.extractFirstIdentifier(string, builder, start);
+ assertThat(retrieved).isEqualTo(string.length()); // it returns the
index where the identifier ends
+ assertThat(builder.toString()).isEqualTo(expected);
+
+ // Quoted string, not interpreted as identifier, starting at arbitrary
position
+ string = "THIS IS BEFORE \"IDENTIFIER\"";
+ expected = "";
+ builder = new StringBuilder();
+ start = 14;
+ retrieved = StringUtils.extractFirstIdentifier(string, builder, start);
+ assertThat(retrieved).isEqualTo(string.length());
+ assertThat(builder.toString()).isEqualTo(expected);
+
+ // Only the not-quoted string, and its size, is returned, starting at
arbitrary position
+ string = "THIS IS BEFORE IDENTIFIER \"";
+ expected = "IDENTIFIER";
+ builder = new StringBuilder();
+ retrieved = StringUtils.extractFirstIdentifier(string, builder, start);
+ assertThat(retrieved).isEqualTo(25); // it returns the index where the
identifier ends
+ assertThat(builder.toString()).isEqualTo(expected);
+
+ string = "IDENTIFIER \"the_identifier";
+ expected = "";
+ builder = new StringBuilder();
+ start = 10;
+ retrieved = StringUtils.extractFirstIdentifier(string, builder, start);
+ assertThat(retrieved).isEqualTo(string.length()); // it returns the
index where the identifier ends
+ assertThat(builder.toString()).isEqualTo(expected);
+
+ string = "IDENTIFIER \"the_identifier";
+ expected = "";
+ builder = new StringBuilder();
+ start = 10;
+ retrieved = StringUtils.extractFirstIdentifier(string, builder, start);
+ assertThat(retrieved).isEqualTo(string.length()); // it returns the
index where the identifier ends
+ assertThat(builder.toString()).isEqualTo(expected);
+
+ string = "\"not an ' identifier\"";
+ expected = "";
+ builder = new StringBuilder();
+ start = 0;
+ retrieved = StringUtils.extractFirstIdentifier(string, builder, start);
+ assertThat(retrieved).isEqualTo(string.length()); // it returns the
whole string length
+ assertThat(builder.toString()).isEqualTo(expected);
+
+ string = "'not an \" identifier'";
+ expected = "";
+ builder = new StringBuilder();
+ retrieved = StringUtils.extractFirstIdentifier(string, builder, start);
+ assertThat(retrieved).isEqualTo(string.length()); // it returns the
whole string length
+ assertThat(builder.toString()).isEqualTo(expected);
+
+ string = "'not an \" identifier\"'";
+ expected = "";
+ builder = new StringBuilder();
+ retrieved = StringUtils.extractFirstIdentifier(string, builder, start);
+ assertThat(retrieved).isEqualTo(string.length()); // it returns the
whole string length
+ assertThat(builder.toString()).isEqualTo(expected);
+
+ string = "\"an \" IDENTIFIER";
+ expected = "IDENTIFIER";
+ builder = new StringBuilder();
+ retrieved = StringUtils.extractFirstIdentifier(string, builder, start);
+ assertThat(retrieved).isEqualTo(string.length()); // it returns the
index where the identifier ends
+ assertThat(builder.toString()).isEqualTo(expected);
+
+ }
+
@Test
public void testSplitStatements() {
String text =
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]