Refactor text functionalities and constants

A new `joinWithSpace` text method has been created in TextUtils to
segregate this functionality from ChatGptPrompt* classes. Additionally,
the class constants SPACE and DOT have been transferred to TextUtils.

Change-Id: I29cf22dc53c7fbc5201284b24e8155799181a517
Signed-off-by: Patrizio <patrizio.gelosi@amarulasolutions.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptPrompt.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptPrompt.java
index 8553a6b..bd991f1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptPrompt.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptPrompt.java
@@ -17,9 +17,6 @@
 
 @Slf4j
 public class ChatGptPrompt {
-    public static final String SPACE = " ";
-    public static final String DOT = ". ";
-
     // Reply attributes
     public static final String ATTRIBUTE_ID = "id";
     public static final String ATTRIBUTE_REPLY = "reply";
@@ -68,10 +65,12 @@
     }
 
     public static String getCommentRequestUserPrompt(int commentPropertiesSize) {
-        return DEFAULT_GPT_PROMPT_FORCE_JSON_FORMAT + SPACE +
-                buildFieldSpecifications(REQUEST_REPLY_ATTRIBUTES) + SPACE +
-                DEFAULT_GPT_REPLIES_PROMPT_INLINE + SPACE +
-                String.format(DEFAULT_GPT_REPLIES_PROMPT_ENFORCE_RESPONSE_CHECK, commentPropertiesSize);
+        return joinWithSpace(new ArrayList<>(List.of(
+                DEFAULT_GPT_PROMPT_FORCE_JSON_FORMAT,
+                buildFieldSpecifications(REQUEST_REPLY_ATTRIBUTES),
+                DEFAULT_GPT_REPLIES_PROMPT_INLINE,
+                String.format(DEFAULT_GPT_REPLIES_PROMPT_ENFORCE_RESPONSE_CHECK, commentPropertiesSize)
+        )));
     }
 
     public static String getReviewPromptCommitMessages() {
@@ -129,8 +128,7 @@
             attributes.remove(ATTRIBUTE_SCORE);
         }
         updateRelevanceDescription();
-        return buildFieldSpecifications(attributes) + SPACE +
-                DEFAULT_GPT_REPLIES_PROMPT_INLINE;
+        return buildFieldSpecifications(attributes) + SPACE + DEFAULT_GPT_REPLIES_PROMPT_INLINE;
     }
 
     private void updateScoreDescription() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptPromptStateful.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptPromptStateful.java
index 2cf6d2b..9a16f7c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptPromptStateful.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptPromptStateful.java
@@ -63,7 +63,7 @@
                 instructions.add(getReviewPromptCommitMessages());
             }
         }
-        return String.join(SPACE, instructions);
+        return joinWithSpace(instructions);
     }
 
     public String getDefaultGptThreadReviewMessage(String patchSet) {
@@ -89,7 +89,7 @@
                         DEFAULT_GPT_ASSISTANT_INSTRUCTIONS_DONT_GUESS_CODE,
                         DEFAULT_GPT_ASSISTANT_INSTRUCTIONS_HISTORY
                 )),
-                RULE_NUMBER_PREFIX, COLON
+                RULE_NUMBER_PREFIX, COLON_SPACE
         )));
     }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptPromptStateless.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptPromptStateless.java
index b63256e..b466c91 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptPromptStateless.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptPromptStateless.java
@@ -9,9 +9,7 @@
 import java.util.Arrays;
 import java.util.List;
 
-import static com.googlesource.gerrit.plugins.chatgpt.utils.StringUtils.concatenate;
-import static com.googlesource.gerrit.plugins.chatgpt.utils.TextUtils.getNumberedListString;
-import static com.googlesource.gerrit.plugins.chatgpt.utils.TextUtils.joinWithNewLine;
+import static com.googlesource.gerrit.plugins.chatgpt.utils.TextUtils.*;
 
 @Slf4j
 public class ChatGptPromptStateless extends ChatGptPrompt {
@@ -33,20 +31,22 @@
     }
 
     public static String getDefaultGptReviewSystemPrompt() {
-        return DEFAULT_GPT_SYSTEM_PROMPT + DOT +
-                DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION + SPACE +
-                DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION_REVIEW;
+        return joinWithSpace(new ArrayList<>(List.of(
+                DEFAULT_GPT_SYSTEM_PROMPT + DOT,
+                DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION,
+                DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION_REVIEW
+        )));
     }
 
     public String getGptSystemPrompt() {
         List<String> prompt = new ArrayList<>(Arrays.asList(
-                config.getString(Configuration.KEY_GPT_SYSTEM_PROMPT, DEFAULT_GPT_SYSTEM_PROMPT), DOT,
+                config.getString(Configuration.KEY_GPT_SYSTEM_PROMPT, DEFAULT_GPT_SYSTEM_PROMPT) + DOT,
                 ChatGptPromptStateless.DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION
         ));
         if (!isCommentEvent) {
-            prompt.addAll(Arrays.asList(SPACE, ChatGptPromptStateless.DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION_REVIEW));
+            prompt.add(ChatGptPromptStateless.DEFAULT_GPT_SYSTEM_PROMPT_INPUT_DESCRIPTION_REVIEW);
         }
-        return concatenate(prompt);
+        return joinWithSpace(prompt);
     }
 
     public String getGptUserPrompt(ChangeSetData changeSetData, String patchSet) {
@@ -88,12 +88,13 @@
     }
 
     private List<String> getReviewSteps() {
-        List<String> steps = new ArrayList<>(){};
-        steps.add(
-                DEFAULT_GPT_REVIEW_PROMPT_REVIEW + SPACE +
-                DEFAULT_GPT_PROMPT_FORCE_JSON_FORMAT + SPACE +
-                getPatchSetReviewUserPrompt()
-        );
+        List<String> steps = new ArrayList<>(List.of(
+                joinWithSpace(new ArrayList<>(List.of(
+                        DEFAULT_GPT_REVIEW_PROMPT_REVIEW,
+                        DEFAULT_GPT_PROMPT_FORCE_JSON_FORMAT,
+                        getPatchSetReviewUserPrompt()
+                )))
+        ));
         if (config.getGptReviewCommitMessages()) {
             steps.add(getReviewPromptCommitMessages());
         }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/TextUtils.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/TextUtils.java
index a78470f..e4f41e8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/TextUtils.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/TextUtils.java
@@ -14,10 +14,11 @@
     public static final String CODE_DELIMITER = "```";
     public static final String CODE_DELIMITER_BEGIN ="\n\n" + CODE_DELIMITER + "\n";
     public static final String CODE_DELIMITER_END ="\n" + CODE_DELIMITER + "\n";
-    public static final String COLON = ": ";
-
-    private static final String COMMA = ", ";
-    private static final String SEMICOLON = "; ";
+    public static final String SPACE = " ";
+    public static final String DOT = ".";
+    public static final String COMMA_SPACE = ", ";
+    public static final String COLON_SPACE = ": ";
+    public static final String SEMICOLON_SPACE = "; ";
 
     public static String parseOutOfDelimiters(String body, String splitDelim, Function<String, String> processMessage,
                                               String leftDelimReplacement, String rightDelimReplacement) {
@@ -48,12 +49,16 @@
         return String.join("\n\n", components);
     }
 
+    public static String joinWithSpace(List<String> components) {
+        return String.join(SPACE, components);
+    }
+
     public static String joinWithComma(Set<String> components) {
-        return String.join(COMMA, components);
+        return String.join(COMMA_SPACE, components);
     }
 
     public static String joinWithSemicolon(List<String> components) {
-        return String.join(SEMICOLON, components);
+        return String.join(SEMICOLON_SPACE, components);
     }
 
     public static List<String> getNumberedList(List<String> components, String prefix, String postfix) {