Skip to content

Commit 3134ec1

Browse files
committed
Use modern language constructs
As we're using a base of Java 17, we can certainly make use of more modern language constructs like enhanced switch and pattern matching for instanceof. Signed-off-by: Łukasz Jernaś <[email protected]>
1 parent 133eb40 commit 3134ec1

File tree

26 files changed

+190
-318
lines changed

26 files changed

+190
-318
lines changed

document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/layout/ForkPDFLayoutTextStripper.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import java.io.IOException;
2020
import java.util.ArrayList;
21-
import java.util.Collections;
2221
import java.util.Iterator;
2322
import java.util.List;
2423

@@ -78,12 +77,11 @@ public void processPage(PDPage page) throws IOException {
7877
@Override
7978
protected void writePage() throws IOException {
8079
List<List<TextPosition>> charactersByArticle = super.getCharactersByArticle();
81-
for (int i = 0; i < charactersByArticle.size(); i++) {
82-
List<TextPosition> textList = charactersByArticle.get(i);
80+
for (List<TextPosition> textList : charactersByArticle) {
8381
try {
8482
this.sortTextPositionList(textList);
8583
}
86-
catch (java.lang.IllegalArgumentException e) {
84+
catch (IllegalArgumentException e) {
8785
logger.error("Error sorting text positions", e);
8886
}
8987
this.iterateThroughTextList(textList.iterator());
@@ -106,7 +104,7 @@ private void writeToOutputStream(final List<TextLine> textLineList) throws IOExc
106104
*/
107105
private void sortTextPositionList(final List<TextPosition> textList) {
108106
TextPositionComparator comparator = new TextPositionComparator();
109-
Collections.sort(textList, comparator);
107+
textList.sort(comparator);
110108
}
111109

112110
private void writeLine(final List<TextPosition> textPositionList) {

memory/repository/spring-ai-model-chat-memory-repository-cassandra/src/main/java/org/springframework/ai/chat/memory/repository/cassandra/CassandraChatMemoryRepository.java

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -207,20 +207,16 @@ private PreparedStatement prepareGetStatement() {
207207
private Message getMessage(UdtValue udt) {
208208
String content = udt.getString(this.conf.messageUdtContentColumn);
209209
Map<String, Object> props = Map.of(CONVERSATION_TS, udt.getInstant(this.conf.messageUdtTimestampColumn));
210-
switch (MessageType.valueOf(udt.getString(this.conf.messageUdtTypeColumn))) {
211-
case ASSISTANT:
212-
return AssistantMessage.builder().content(content).properties(props).build();
213-
case USER:
214-
return UserMessage.builder().text(content).metadata(props).build();
215-
case SYSTEM:
216-
return SystemMessage.builder().text(content).metadata(props).build();
217-
case TOOL:
210+
return switch (MessageType.valueOf(udt.getString(this.conf.messageUdtTypeColumn))) {
211+
case ASSISTANT -> AssistantMessage.builder().content(content).properties(props).build();
212+
case USER -> UserMessage.builder().text(content).metadata(props).build();
213+
case SYSTEM -> SystemMessage.builder().text(content).metadata(props).build();
214+
case TOOL ->
218215
// todo – persist ToolResponse somehow
219-
return ToolResponseMessage.builder().responses(List.of()).metadata(props).build();
220-
default:
221-
throw new IllegalStateException(
222-
String.format("unknown message type %s", udt.getString(this.conf.messageUdtTypeColumn)));
223-
}
216+
ToolResponseMessage.builder().responses(List.of()).metadata(props).build();
217+
default -> throw new IllegalStateException(
218+
String.format("unknown message type %s", udt.getString(this.conf.messageUdtTypeColumn)));
219+
};
224220
}
225221

226222
}

models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,7 @@ ConverseRequest createRequest(Prompt prompt) {
332332
.map(message -> {
333333
if (message.getMessageType() == MessageType.USER) {
334334
List<ContentBlock> contents = new ArrayList<>();
335-
if (message instanceof UserMessage) {
336-
var userMessage = (UserMessage) message;
335+
if (message instanceof UserMessage userMessage) {
337336
contents.add(ContentBlock.fromText(userMessage.getText()));
338337

339338
if (!CollectionUtils.isEmpty(userMessage.getMedia())) {

models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/MessageToPromptConverter.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,14 @@ public String toPrompt(List<Message> messages) {
8181
}
8282

8383
protected String messageToString(Message message) {
84-
switch (message.getMessageType()) {
85-
case SYSTEM:
86-
return message.getText();
87-
case USER:
88-
return this.humanPrompt + " " + message.getText();
89-
case ASSISTANT:
90-
return this.assistantPrompt + " " + message.getText();
91-
case TOOL:
84+
return switch (message.getMessageType()) {
85+
case SYSTEM -> message.getText();
86+
case USER -> this.humanPrompt + " " + message.getText();
87+
case ASSISTANT -> this.assistantPrompt + " " + message.getText();
88+
case TOOL ->
9289
throw new IllegalArgumentException("Tool execution results are not supported for Bedrock models");
93-
}
90+
};
9491

95-
throw new IllegalArgumentException("Unknown message type: " + message.getMessageType());
9692
}
9793

9894
}

models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/GoogleGenAiChatModel.java

Lines changed: 33 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -250,16 +250,11 @@ private static GeminiMessageType toGeminiMessageType(@NonNull MessageType type)
250250

251251
Assert.notNull(type, "Message type must not be null");
252252

253-
switch (type) {
254-
case SYSTEM:
255-
case USER:
256-
case TOOL:
257-
return GeminiMessageType.USER;
258-
case ASSISTANT:
259-
return GeminiMessageType.MODEL;
260-
default:
261-
throw new IllegalArgumentException("Unsupported message type: " + type);
262-
}
253+
return switch (type) {
254+
case SYSTEM, USER, TOOL -> GeminiMessageType.USER;
255+
case ASSISTANT -> GeminiMessageType.MODEL;
256+
default -> throw new IllegalArgumentException("Unsupported message type: " + type);
257+
};
263258
}
264259

265260
static List<Part> messageToGeminiParts(Message message) {
@@ -780,51 +775,38 @@ GeminiRequest createGeminiRequest(Prompt prompt) {
780775
// Helper methods for mapping safety settings enums
781776
private static com.google.genai.types.HarmCategory mapToGenAiHarmCategory(
782777
GoogleGenAiSafetySetting.HarmCategory category) {
783-
switch (category) {
784-
case HARM_CATEGORY_UNSPECIFIED:
785-
return new com.google.genai.types.HarmCategory(
786-
com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_UNSPECIFIED);
787-
case HARM_CATEGORY_HATE_SPEECH:
788-
return new com.google.genai.types.HarmCategory(
789-
com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_HATE_SPEECH);
790-
case HARM_CATEGORY_DANGEROUS_CONTENT:
791-
return new com.google.genai.types.HarmCategory(
792-
com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_DANGEROUS_CONTENT);
793-
case HARM_CATEGORY_HARASSMENT:
794-
return new com.google.genai.types.HarmCategory(
795-
com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_HARASSMENT);
796-
case HARM_CATEGORY_SEXUALLY_EXPLICIT:
797-
return new com.google.genai.types.HarmCategory(
798-
com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_SEXUALLY_EXPLICIT);
799-
default:
800-
throw new IllegalArgumentException("Unknown HarmCategory: " + category);
801-
}
778+
return switch (category) {
779+
case HARM_CATEGORY_UNSPECIFIED -> new com.google.genai.types.HarmCategory(
780+
com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_UNSPECIFIED);
781+
case HARM_CATEGORY_HATE_SPEECH -> new com.google.genai.types.HarmCategory(
782+
com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_HATE_SPEECH);
783+
case HARM_CATEGORY_DANGEROUS_CONTENT -> new com.google.genai.types.HarmCategory(
784+
com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_DANGEROUS_CONTENT);
785+
case HARM_CATEGORY_HARASSMENT -> new com.google.genai.types.HarmCategory(
786+
com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_HARASSMENT);
787+
case HARM_CATEGORY_SEXUALLY_EXPLICIT -> new com.google.genai.types.HarmCategory(
788+
com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_SEXUALLY_EXPLICIT);
789+
default -> throw new IllegalArgumentException("Unknown HarmCategory: " + category);
790+
};
802791
}
803792

804793
private static com.google.genai.types.HarmBlockThreshold mapToGenAiHarmBlockThreshold(
805794
GoogleGenAiSafetySetting.HarmBlockThreshold threshold) {
806-
switch (threshold) {
807-
case HARM_BLOCK_THRESHOLD_UNSPECIFIED:
808-
return new com.google.genai.types.HarmBlockThreshold(
809-
com.google.genai.types.HarmBlockThreshold.Known.HARM_BLOCK_THRESHOLD_UNSPECIFIED);
810-
case BLOCK_LOW_AND_ABOVE:
811-
return new com.google.genai.types.HarmBlockThreshold(
812-
com.google.genai.types.HarmBlockThreshold.Known.BLOCK_LOW_AND_ABOVE);
813-
case BLOCK_MEDIUM_AND_ABOVE:
814-
return new com.google.genai.types.HarmBlockThreshold(
815-
com.google.genai.types.HarmBlockThreshold.Known.BLOCK_MEDIUM_AND_ABOVE);
816-
case BLOCK_ONLY_HIGH:
817-
return new com.google.genai.types.HarmBlockThreshold(
818-
com.google.genai.types.HarmBlockThreshold.Known.BLOCK_ONLY_HIGH);
819-
case BLOCK_NONE:
820-
return new com.google.genai.types.HarmBlockThreshold(
821-
com.google.genai.types.HarmBlockThreshold.Known.BLOCK_NONE);
822-
case OFF:
823-
return new com.google.genai.types.HarmBlockThreshold(
824-
com.google.genai.types.HarmBlockThreshold.Known.OFF);
825-
default:
826-
throw new IllegalArgumentException("Unknown HarmBlockThreshold: " + threshold);
827-
}
795+
return switch (threshold) {
796+
case HARM_BLOCK_THRESHOLD_UNSPECIFIED -> new com.google.genai.types.HarmBlockThreshold(
797+
com.google.genai.types.HarmBlockThreshold.Known.HARM_BLOCK_THRESHOLD_UNSPECIFIED);
798+
case BLOCK_LOW_AND_ABOVE -> new com.google.genai.types.HarmBlockThreshold(
799+
com.google.genai.types.HarmBlockThreshold.Known.BLOCK_LOW_AND_ABOVE);
800+
case BLOCK_MEDIUM_AND_ABOVE -> new com.google.genai.types.HarmBlockThreshold(
801+
com.google.genai.types.HarmBlockThreshold.Known.BLOCK_MEDIUM_AND_ABOVE);
802+
case BLOCK_ONLY_HIGH -> new com.google.genai.types.HarmBlockThreshold(
803+
com.google.genai.types.HarmBlockThreshold.Known.BLOCK_ONLY_HIGH);
804+
case BLOCK_NONE -> new com.google.genai.types.HarmBlockThreshold(
805+
com.google.genai.types.HarmBlockThreshold.Known.BLOCK_NONE);
806+
case OFF ->
807+
new com.google.genai.types.HarmBlockThreshold(com.google.genai.types.HarmBlockThreshold.Known.OFF);
808+
default -> throw new IllegalArgumentException("Unknown HarmBlockThreshold: " + threshold);
809+
};
828810
}
829811

830812
private List<Content> toGeminiContent(List<Message> instructions) {

models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/metadata/GoogleGenAiModalityTokenCount.java

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,19 +70,11 @@ private static String convertModality(MediaModality modality) {
7070
String modalityStr = modality.toString().toUpperCase();
7171

7272
// Map SDK values to cleaner names
73-
switch (modalityStr) {
74-
case "TEXT":
75-
case "IMAGE":
76-
case "VIDEO":
77-
case "AUDIO":
78-
case "DOCUMENT":
79-
return modalityStr;
80-
case "MODALITY_UNSPECIFIED":
81-
case "MEDIA_MODALITY_UNSPECIFIED":
82-
return "UNKNOWN";
83-
default:
84-
return modalityStr;
85-
}
73+
return switch (modalityStr) {
74+
case "TEXT", "IMAGE", "VIDEO", "AUDIO", "DOCUMENT" -> modalityStr;
75+
case "MODALITY_UNSPECIFIED", "MEDIA_MODALITY_UNSPECIFIED" -> "UNKNOWN";
76+
default -> modalityStr;
77+
};
8678
}
8779

8880
/**

models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/metadata/GoogleGenAiTrafficType.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,20 @@ public static GoogleGenAiTrafficType from(TrafficType trafficType) {
6363
String typeStr = trafficType.toString().toUpperCase();
6464

6565
// Map SDK values to our enum values
66-
switch (typeStr) {
67-
case "ON_DEMAND":
68-
return ON_DEMAND;
69-
case "PROVISIONED_THROUGHPUT":
70-
return PROVISIONED_THROUGHPUT;
71-
case "TRAFFIC_TYPE_UNSPECIFIED":
72-
return UNKNOWN;
73-
default:
66+
return switch (typeStr) {
67+
case "ON_DEMAND" -> ON_DEMAND;
68+
case "PROVISIONED_THROUGHPUT" -> PROVISIONED_THROUGHPUT;
69+
case "TRAFFIC_TYPE_UNSPECIFIED" -> UNKNOWN;
70+
default -> {
7471
// Try exact match
7572
for (GoogleGenAiTrafficType type : values()) {
7673
if (type.value.equals(typeStr)) {
77-
return type;
74+
yield type;
7875
}
7976
}
80-
return UNKNOWN;
81-
}
77+
yield UNKNOWN;
78+
}
79+
};
8280
}
8381

8482
/**

models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -457,18 +457,13 @@ MistralAiApi.ChatCompletionRequest createRequest(Prompt prompt, boolean stream)
457457
}
458458

459459
private Stream<ChatCompletionMessage> createChatCompletionMessages(Message message) {
460-
switch (message.getMessageType()) {
461-
case USER:
462-
return Stream.of(createUserChatCompletionMessage(message));
463-
case SYSTEM:
464-
return Stream.of(createSystemChatCompletionMessage(message));
465-
case ASSISTANT:
466-
return Stream.of(createAssistantChatCompletionMessage(message));
467-
case TOOL:
468-
return createToolChatCompletionMessages(message);
469-
default:
470-
throw new IllegalStateException("Unknown message type: " + message.getMessageType());
471-
}
460+
return switch (message.getMessageType()) {
461+
case USER -> Stream.of(createUserChatCompletionMessage(message));
462+
case SYSTEM -> Stream.of(createSystemChatCompletionMessage(message));
463+
case ASSISTANT -> Stream.of(createAssistantChatCompletionMessage(message));
464+
case TOOL -> createToolChatCompletionMessages(message);
465+
default -> throw new IllegalStateException("Unknown message type: " + message.getMessageType());
466+
};
472467
}
473468

474469
private Stream<ChatCompletionMessage> createToolChatCompletionMessages(Message message) {

models/spring-ai-stability-ai/src/main/java/org/springframework/ai/stabilityai/StabilityAiImageModel.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,7 @@ StabilityAiImageOptions mergeOptions(ImageOptions runtimeOptions, StabilityAiIma
137137
.seed(defaultOptions.getSeed())
138138
.steps(defaultOptions.getSteps())
139139
.stylePreset(ModelOptionsUtils.mergeOption(runtimeOptions.getStyle(), defaultOptions.getStylePreset()));
140-
if (runtimeOptions instanceof StabilityAiImageOptions) {
141-
StabilityAiImageOptions stabilityOptions = (StabilityAiImageOptions) runtimeOptions;
140+
if (runtimeOptions instanceof StabilityAiImageOptions stabilityOptions) {
142141
// Handle Stability AI specific image options
143142
builder
144143
.cfgScale(ModelOptionsUtils.mergeOption(stabilityOptions.getCfgScale(), defaultOptions.getCfgScale()))

models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -244,16 +244,11 @@ private static GeminiMessageType toGeminiMessageType(@NonNull MessageType type)
244244

245245
Assert.notNull(type, "Message type must not be null");
246246

247-
switch (type) {
248-
case SYSTEM:
249-
case USER:
250-
case TOOL:
251-
return GeminiMessageType.USER;
252-
case ASSISTANT:
253-
return GeminiMessageType.MODEL;
254-
default:
255-
throw new IllegalArgumentException("Unsupported message type: " + type);
256-
}
247+
return switch (type) {
248+
case SYSTEM, USER, TOOL -> GeminiMessageType.USER;
249+
case ASSISTANT -> GeminiMessageType.MODEL;
250+
default -> throw new IllegalArgumentException("Unsupported message type: " + type);
251+
};
257252
}
258253

259254
static List<Part> messageToGeminiParts(Message message) {

0 commit comments

Comments
 (0)