Skip to content

Commit 4171e8f

Browse files
committed
GH-1724: added support for spring data jdbc AOT repositories
1 parent 95a8458 commit 4171e8f

File tree

6 files changed

+55
-6
lines changed

6 files changed

+55
-6
lines changed

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Annotations.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public class Annotations {
5252
public static final String DATA_JPA_NATIVE_QUERY = "org.springframework.data.jpa.repository.NativeQuery";
5353
public static final String DATA_MONGODB_QUERY = "org.springframework.data.mongodb.repository.Query";
5454
public static final String DATA_REST_BASE_PATH_AWARE_CONTROLLER = "org.springframework.data.rest.webmvc.BasePathAwareController";
55+
public static final String DATA_JDBC_QUERY = "org.springframework.data.jdbc.repository.query.Query";
5556

5657
public static final String AUTOWIRED = "org.springframework.beans.factory.annotation.Autowired";
5758
public static final String QUALIFIER = "org.springframework.beans.factory.annotation.Qualifier";

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataCodeLensProvider.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@
5151
public class DataRepositoryAotMetadataCodeLensProvider implements CodeLensProvider {
5252

5353
private static final String COVERT_TO_QUERY_LABEL = "Turn into @Query";
54+
55+
private static final Map<DataRepositoryModule, String> moduleToQueryMapping = Map.of(
56+
DataRepositoryModule.JPA, Annotations.DATA_JPA_QUERY,
57+
DataRepositoryModule.JDBC, Annotations.DATA_JDBC_QUERY,
58+
DataRepositoryModule.MONGODB, Annotations.DATA_MONGODB_QUERY
59+
);
5460

5561
private static final Logger log = LoggerFactory.getLogger(DataRepositoryAotMetadataCodeLensProvider.class);
5662

@@ -146,7 +152,8 @@ private List<CodeLens> createCodeLenses(IJavaProject project, MethodDeclaration
146152
Optional<DataRepositoryAotMetadata> optMetadata = getMetadata(repositoryMetadataService, project, mb);
147153
optMetadata.ifPresentOrElse(metadata -> metadata.findMethod(mb).ifPresent(methodMetadata -> {
148154
boolean isQueryAnnotated = hierarchyAnnot.isAnnotatedWith(mb, Annotations.DATA_JPA_QUERY)
149-
|| hierarchyAnnot.isAnnotatedWith(mb, Annotations.DATA_MONGODB_QUERY);
155+
|| hierarchyAnnot.isAnnotatedWith(mb, Annotations.DATA_MONGODB_QUERY)
156+
|| hierarchyAnnot.isAnnotatedWith(mb, Annotations.DATA_JDBC_QUERY);
150157

151158
if (!isQueryAnnotated) {
152159
codeLenses.add(new CodeLens(range, refactorings.createFixCommand(COVERT_TO_QUERY_LABEL, createFixDescriptor(mb, document.getUri(), metadata.module(), methodMetadata)), null));
@@ -196,7 +203,7 @@ static FixDescriptor createFixDescriptor(IMethodBinding mb, String docUri, DataR
196203
.withRecipeScope(RecipeScope.FILE)
197204

198205
.withParameters(Map.of(
199-
"annotationType", module == DataRepositoryModule.JPA ? Annotations.DATA_JPA_QUERY : Annotations.DATA_MONGODB_QUERY,
206+
"annotationType", moduleToQueryMapping.get(module),
200207
"method", "%s %s(%s)".formatted(mb.getDeclaringClass().getQualifiedName(), mb.getName(),
201208
Arrays.stream(mb.getParameterTypes())
202209
.map(pt -> pt.getQualifiedName())
@@ -214,5 +221,5 @@ private static List<AddAnnotationOverMethod.Attribute> createAttributeList(Map<S
214221

215222
return result;
216223
}
217-
224+
218225
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryAotMetadataService.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ public DataRepositoryAotMetadata deserialize(JsonElement json, Type typeOfT,
8989
return new DataRepositoryAotMetadata(name, type, moduleType, context.deserialize(o.get(METHODS), MongoAotMethodMetadata[].class));
9090
case JPA:
9191
return new DataRepositoryAotMetadata(name, type, moduleType, context.deserialize(o.get(METHODS), JpaAotMethodMetadata[].class));
92+
case JDBC:
93+
return new DataRepositoryAotMetadata(name, type, moduleType, context.deserialize(o.get(METHODS), JdbcAotMethodMetadata[].class));
9294
}
9395
}
9496
return null;
@@ -157,7 +159,7 @@ private Optional<DataRepositoryAotMetadata> readMetadataFile(Path filePath) {
157159
if (Files.isRegularFile(filePath)) {
158160
try (BufferedReader reader = Files.newBufferedReader(filePath)) {
159161
return Optional.ofNullable(gson.fromJson(reader, DataRepositoryAotMetadata.class));
160-
} catch (IOException e) {
162+
} catch (Exception e) {
161163
log.error("Failed to read metadata file: {}", filePath, e);
162164
}
163165
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositoryModule.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
public enum DataRepositoryModule {
1414

1515
JPA,
16-
MONGODB
16+
MONGODB,
17+
JDBC
1718

1819
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Broadcom, Inc.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v1.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-v10.html
7+
*
8+
* Contributors:
9+
* Broadcom, Inc. - initial API and implementation
10+
*******************************************************************************/
11+
package org.springframework.ide.vscode.boot.java.data;
12+
13+
import java.util.Map;
14+
15+
class JdbcAotMethodMetadata extends AbstractDataRepositoryAotMethodMetadata {
16+
17+
record Query(String query) {}
18+
19+
private Query query;
20+
21+
public JdbcAotMethodMetadata(String name, String signature, Query query) {
22+
super(name, signature);
23+
this.query = query;
24+
}
25+
26+
@Override
27+
public String getQueryStatement() {
28+
return query == null ? null : query.query();
29+
}
30+
31+
@Override
32+
public Map<String, String> getAttributesMap() {
33+
return Map.of("value", getQueryStatement());
34+
}
35+
36+
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/QueryMethodCodeActionProvider.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@ public boolean isApplicable(IJavaProject project) {
5050
static boolean isValidProject(IJavaProject project) {
5151
Version springDataJpaVersion = SpringProjectUtil.getDependencyVersion(project, "spring-data-jpa");
5252
Version springDataMongoDbVersion = SpringProjectUtil.getDependencyVersion(project, "spring-data-mongodb");
53+
Version springDataJddbcVersion = SpringProjectUtil.getDependencyVersion(project, "spring-data-jdbc");
5354
return (springDataJpaVersion != null && springDataJpaVersion.getMajor() >= 4)
54-
|| (springDataMongoDbVersion != null && springDataMongoDbVersion.getMajor() >= 5);
55+
|| (springDataMongoDbVersion != null && springDataMongoDbVersion.getMajor() >= 5)
56+
|| (springDataJddbcVersion != null && springDataJddbcVersion.getMajor() >= 4);
5557
}
5658

5759
@Override

0 commit comments

Comments
 (0)