Skip to content

Commit cb9a105

Browse files
authored
Housekeeping. Removed Superbuilders. Fixed deprecations (#1103)
1 parent fbe4974 commit cb9a105

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+310
-120
lines changed

.github/workflows/backend_tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,4 @@ jobs:
3434

3535
- name: "Tests"
3636
run: |
37-
./gradlew :api:test --info
37+
./gradlew :api:test

api/build.gradle

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,14 @@ generateGrammarSource {
106106
arguments += ["-package", "ksql"]
107107
}
108108

109+
tasks.withType(JavaCompile) {
110+
options.compilerArgs << "-Xlint:deprecation" << "-Xlint:unchecked"
111+
}
112+
113+
114+
109115
sourceSets {
110116
main {
111-
antlr {
112-
srcDirs = ["src/main/antlr4"]
113-
}
114117
java {
115118
srcDirs += generateGrammarSource.outputDirectory
116119
}

api/src/main/java/io/kafbat/ui/config/McpConfig.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import io.kafbat.ui.service.mcp.McpTool;
66
import io.modelcontextprotocol.server.McpAsyncServer;
77
import io.modelcontextprotocol.server.McpServer;
8-
import io.modelcontextprotocol.server.McpServerFeatures.AsyncPromptSpecification;
98
import io.modelcontextprotocol.server.McpServerFeatures.AsyncToolSpecification;
109
import io.modelcontextprotocol.server.transport.WebFluxSseServerTransportProvider;
1110
import io.modelcontextprotocol.spec.McpSchema;

api/src/main/java/io/kafbat/ui/controller/ApplicationConfigController.java

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55

66
import io.kafbat.ui.api.ApplicationConfigApi;
77
import io.kafbat.ui.config.ClustersProperties;
8-
import io.kafbat.ui.model.ActionDTO;
8+
import io.kafbat.ui.mapper.DynamicConfigMapper;
99
import io.kafbat.ui.model.AppAuthenticationSettingsDTO;
1010
import io.kafbat.ui.model.ApplicationConfigDTO;
11-
import io.kafbat.ui.model.ApplicationConfigPropertiesDTO;
1211
import io.kafbat.ui.model.ApplicationConfigValidationDTO;
1312
import io.kafbat.ui.model.ApplicationInfoDTO;
1413
import io.kafbat.ui.model.ClusterConfigValidationDTO;
@@ -20,12 +19,9 @@
2019
import io.kafbat.ui.util.ApplicationRestarter;
2120
import io.kafbat.ui.util.DynamicConfigOperations;
2221
import java.util.Map;
23-
import java.util.Optional;
2422
import javax.annotation.Nullable;
2523
import lombok.RequiredArgsConstructor;
2624
import lombok.extern.slf4j.Slf4j;
27-
import org.mapstruct.Mapper;
28-
import org.mapstruct.factory.Mappers;
2925
import org.springframework.http.ResponseEntity;
3026
import org.springframework.http.codec.multipart.FilePart;
3127
import org.springframework.http.codec.multipart.Part;
@@ -41,26 +37,11 @@
4137
@RequiredArgsConstructor
4238
public class ApplicationConfigController extends AbstractController implements ApplicationConfigApi {
4339

44-
private static final PropertiesMapper MAPPER = Mappers.getMapper(PropertiesMapper.class);
45-
46-
@Mapper
47-
interface PropertiesMapper {
48-
49-
DynamicConfigOperations.PropertiesStructure fromDto(ApplicationConfigPropertiesDTO dto);
50-
51-
ApplicationConfigPropertiesDTO toDto(DynamicConfigOperations.PropertiesStructure propertiesStructure);
52-
53-
default ActionDTO stringToActionDto(String str) {
54-
return Optional.ofNullable(str)
55-
.map(s -> Enum.valueOf(ActionDTO.class, s.toUpperCase()))
56-
.orElseThrow();
57-
}
58-
}
59-
6040
private final DynamicConfigOperations dynamicConfigOperations;
6141
private final ApplicationRestarter restarter;
6242
private final KafkaClusterFactory kafkaClusterFactory;
6343
private final ApplicationInfoService applicationInfoService;
44+
private final DynamicConfigMapper configMapper;
6445

6546
@Override
6647
public Mono<ResponseEntity<ApplicationInfoDTO>> getApplicationInfo(ServerWebExchange exchange) {
@@ -83,7 +64,7 @@ public Mono<ResponseEntity<ApplicationConfigDTO>> getCurrentConfig(ServerWebExch
8364
return validateAccess(context)
8465
.then(Mono.fromSupplier(() -> ResponseEntity.ok(
8566
new ApplicationConfigDTO()
86-
.properties(MAPPER.toDto(dynamicConfigOperations.getCurrentProperties()))
67+
.properties(configMapper.toDto(dynamicConfigOperations.getCurrentProperties()))
8768
)))
8869
.doOnEach(sig -> audit(context, sig));
8970
}
@@ -98,7 +79,7 @@ public Mono<ResponseEntity<Void>> restartWithConfig(Mono<RestartRequestDTO> rest
9879
return validateAccess(context)
9980
.then(restartRequestDto)
10081
.doOnNext(restartDto -> {
101-
var newConfig = MAPPER.fromDto(restartDto.getConfig().getProperties());
82+
var newConfig = configMapper.fromDto(restartDto.getConfig().getProperties());
10283
dynamicConfigOperations.persist(newConfig);
10384
})
10485
.doOnEach(sig -> audit(context, sig))
@@ -132,7 +113,7 @@ public Mono<ResponseEntity<ApplicationConfigValidationDTO>> validateConfig(Mono<
132113
return validateAccess(context)
133114
.then(configDto)
134115
.flatMap(config -> {
135-
DynamicConfigOperations.PropertiesStructure newConfig = MAPPER.fromDto(config.getProperties());
116+
DynamicConfigOperations.PropertiesStructure newConfig = configMapper.fromDto(config.getProperties());
136117
ClustersProperties clustersProperties = newConfig.getKafka();
137118
return validateClustersConfig(clustersProperties)
138119
.map(validations -> new ApplicationConfigValidationDTO().clusters(validations));

api/src/main/java/io/kafbat/ui/controller/AuthorizationController.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,22 @@ public Mono<ResponseEntity<AuthenticationInfoDTO>> getUserAuthInfo(ServerWebExch
4545
.map(SecurityContext::getAuthentication)
4646
.map(Principal::getName);
4747

48-
var builder = AuthenticationInfoDTO.builder()
48+
var builder = new AuthenticationInfoDTO()
4949
.rbacEnabled(accessControlService.isRbacEnabled());
5050

5151
return userName
5252
.zipWith(permissions)
5353
.map(data -> (AuthenticationInfoDTO) builder
5454
.userInfo(new UserInfoDTO(data.getT1(), data.getT2()))
55-
.build()
5655
)
57-
.switchIfEmpty(Mono.just(builder.build()))
56+
.switchIfEmpty(Mono.just(builder))
5857
.map(ResponseEntity::ok);
5958
}
6059

6160
private List<UserPermissionDTO> mapPermissions(List<Permission> permissions, List<String> clusters) {
6261
return permissions
6362
.stream()
64-
.map(permission -> (UserPermissionDTO) UserPermissionDTO.builder()
63+
.map(permission -> new UserPermissionDTO()
6564
.clusters(clusters)
6665
.resource(ResourceTypeDTO.fromValue(permission.getResource().toString().toUpperCase()))
6766
.value(permission.getValue())
@@ -71,7 +70,6 @@ private List<UserPermissionDTO> mapPermissions(List<Permission> permissions, Lis
7170
.map(this::mapAction)
7271
.filter(Objects::nonNull)
7372
.toList())
74-
.build()
7573
)
7674
.toList();
7775
}

api/src/main/java/io/kafbat/ui/exception/GlobalErrorWebExceptionHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ private String extractFieldErrorMsg(FieldError fieldError) {
161161
return coalesce(fieldError.getDefaultMessage(), fieldError.getCode(), "Invalid field value");
162162
}
163163

164+
@SafeVarargs
164165
private <T> T coalesce(T... items) {
165166
return Stream.of(items).filter(Objects::nonNull).findFirst().orElse(null);
166167
}

api/src/main/java/io/kafbat/ui/mapper/ClusterMapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@
4949
@Mapper(componentModel = "spring")
5050
public interface ClusterMapper {
5151

52+
@Mapping(target = "defaultCluster", ignore = true)
5253
ClusterDTO toCluster(InternalClusterState clusterState);
5354

55+
@Mapping(target = "zooKeeperStatus", ignore = true)
5456
ClusterStatsDTO toClusterStats(InternalClusterState clusterState);
5557

5658
default ClusterMetricsDTO toClusterMetrics(Metrics metrics) {
@@ -95,6 +97,8 @@ default ConfigSynonymDTO toConfigSynonym(ConfigEntry.ConfigSynonym config) {
9597

9698
BrokerDTO toBrokerDto(InternalBroker broker);
9799

100+
@Mapping(target = "keySerde", ignore = true)
101+
@Mapping(target = "valueSerde", ignore = true)
98102
TopicDetailsDTO toTopicDetails(InternalTopic topic);
99103

100104
@Mapping(target = "isReadOnly", source = "readOnly")

api/src/main/java/io/kafbat/ui/mapper/DescribeLogDirsMapper.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import java.util.List;
88
import java.util.Map;
99
import java.util.stream.Collectors;
10+
import org.apache.kafka.clients.admin.LogDirDescription;
11+
import org.apache.kafka.clients.admin.ReplicaInfo;
1012
import org.apache.kafka.common.TopicPartition;
1113
import org.apache.kafka.common.protocol.Errors;
1214
import org.apache.kafka.common.requests.DescribeLogDirsResponse;
@@ -16,7 +18,7 @@
1618
public class DescribeLogDirsMapper {
1719

1820
public List<BrokersLogdirsDTO> toBrokerLogDirsList(
19-
Map<Integer, Map<String, DescribeLogDirsResponse.LogDirInfo>> logDirsInfo) {
21+
Map<Integer, Map<String, LogDirDescription>> logDirsInfo) {
2022

2123
return logDirsInfo.entrySet().stream().map(
2224
mapEntry -> mapEntry.getValue().entrySet().stream()
@@ -26,13 +28,13 @@ public List<BrokersLogdirsDTO> toBrokerLogDirsList(
2628
}
2729

2830
private BrokersLogdirsDTO toBrokerLogDirs(Integer broker, String dirName,
29-
DescribeLogDirsResponse.LogDirInfo logDirInfo) {
31+
LogDirDescription logDirInfo) {
3032
BrokersLogdirsDTO result = new BrokersLogdirsDTO();
3133
result.setName(dirName);
32-
if (logDirInfo.error != null && logDirInfo.error != Errors.NONE) {
33-
result.setError(logDirInfo.error.message());
34+
if (logDirInfo.error() != null) {
35+
result.setError(logDirInfo.error().getMessage());
3436
}
35-
var topics = logDirInfo.replicaInfos.entrySet().stream()
37+
var topics = logDirInfo.replicaInfos().entrySet().stream()
3638
.collect(Collectors.groupingBy(e -> e.getKey().topic())).entrySet().stream()
3739
.map(e -> toTopicLogDirs(broker, e.getKey(), e.getValue()))
3840
.toList();
@@ -41,8 +43,7 @@ private BrokersLogdirsDTO toBrokerLogDirs(Integer broker, String dirName,
4143
}
4244

4345
private BrokerTopicLogdirsDTO toTopicLogDirs(Integer broker, String name,
44-
List<Map.Entry<TopicPartition,
45-
DescribeLogDirsResponse.ReplicaInfo>> partitions) {
46+
List<Map.Entry<TopicPartition, ReplicaInfo>> partitions) {
4647
BrokerTopicLogdirsDTO topic = new BrokerTopicLogdirsDTO();
4748
topic.setName(name);
4849
topic.setPartitions(
@@ -54,12 +55,12 @@ private BrokerTopicLogdirsDTO toTopicLogDirs(Integer broker, String name,
5455
}
5556

5657
private BrokerTopicPartitionLogdirDTO topicPartitionLogDir(Integer broker, Integer partition,
57-
DescribeLogDirsResponse.ReplicaInfo replicaInfo) {
58+
ReplicaInfo replicaInfo) {
5859
BrokerTopicPartitionLogdirDTO logDir = new BrokerTopicPartitionLogdirDTO();
5960
logDir.setBroker(broker);
6061
logDir.setPartition(partition);
61-
logDir.setSize(replicaInfo.size);
62-
logDir.setOffsetLag(replicaInfo.offsetLag);
62+
logDir.setSize(replicaInfo.size());
63+
logDir.setOffsetLag(replicaInfo.offsetLag());
6364
return logDir;
6465
}
6566
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package io.kafbat.ui.mapper;
2+
3+
import io.kafbat.ui.model.ActionDTO;
4+
import io.kafbat.ui.model.ApplicationConfigPropertiesAuthOauth2ResourceServerDTO;
5+
import io.kafbat.ui.model.ApplicationConfigPropertiesAuthOauth2ResourceServerJwtDTO;
6+
import io.kafbat.ui.model.ApplicationConfigPropertiesAuthOauth2ResourceServerOpaquetokenDTO;
7+
import io.kafbat.ui.model.ApplicationConfigPropertiesDTO;
8+
import io.kafbat.ui.model.ApplicationConfigPropertiesRbacRolesInnerPermissionsInnerDTO;
9+
import io.kafbat.ui.model.rbac.Permission;
10+
import io.kafbat.ui.util.DynamicConfigOperations;
11+
import java.util.Optional;
12+
import org.mapstruct.Mapper;
13+
import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerProperties;
14+
import org.springframework.core.io.FileSystemResource;
15+
import org.springframework.core.io.Resource;
16+
17+
@Mapper(componentModel = "spring")
18+
public interface DynamicConfigMapper {
19+
20+
DynamicConfigOperations.PropertiesStructure fromDto(ApplicationConfigPropertiesDTO dto);
21+
22+
ApplicationConfigPropertiesDTO toDto(DynamicConfigOperations.PropertiesStructure propertiesStructure);
23+
24+
default String map(Resource resource) {
25+
return resource.getFilename();
26+
}
27+
28+
default Permission map(ApplicationConfigPropertiesRbacRolesInnerPermissionsInnerDTO perm) {
29+
Permission permission = new Permission();
30+
permission.setResource(perm.getResource().getValue());
31+
permission.setActions(perm.getActions().stream().map(ActionDTO::getValue).toList());
32+
permission.setValue(perm.getValue());
33+
return permission;
34+
}
35+
36+
default OAuth2ResourceServerProperties map(ApplicationConfigPropertiesAuthOauth2ResourceServerDTO value) {
37+
if (value != null) {
38+
OAuth2ResourceServerProperties result = new OAuth2ResourceServerProperties();
39+
if (value.getJwt() != null) {
40+
OAuth2ResourceServerProperties.Jwt jwt = result.getJwt();
41+
42+
ApplicationConfigPropertiesAuthOauth2ResourceServerJwtDTO source = value.getJwt();
43+
Optional.ofNullable(source.getJwsAlgorithms()).ifPresent(jwt::setJwsAlgorithms);
44+
Optional.ofNullable(source.getJwkSetUri()).ifPresent(jwt::setJwkSetUri);
45+
Optional.ofNullable(source.getIssuerUri()).ifPresent(jwt::setIssuerUri);
46+
Optional.ofNullable(source.getPublicKeyLocation())
47+
.map(this::mapResource)
48+
.ifPresent(jwt::setPublicKeyLocation);
49+
Optional.ofNullable(source.getAudiences()).ifPresent(jwt::setAudiences);
50+
Optional.ofNullable(source.getAuthoritiesClaimName()).ifPresent(jwt::setAuthoritiesClaimName);
51+
Optional.ofNullable(source.getAuthoritiesClaimDelimiter()).ifPresent(jwt::setAuthoritiesClaimDelimiter);
52+
Optional.ofNullable(source.getAuthorityPrefix()).ifPresent(jwt::setAuthorityPrefix);
53+
Optional.ofNullable(source.getPrincipalClaimName()).ifPresent(jwt::setPrincipalClaimName);
54+
}
55+
if (value.getOpaquetoken() != null) {
56+
OAuth2ResourceServerProperties.Opaquetoken opaquetoken = result.getOpaquetoken();
57+
ApplicationConfigPropertiesAuthOauth2ResourceServerOpaquetokenDTO source = value.getOpaquetoken();
58+
Optional.ofNullable(source.getClientId()).ifPresent(opaquetoken::setClientId);
59+
Optional.ofNullable(source.getClientSecret()).ifPresent(opaquetoken::setClientSecret);
60+
Optional.ofNullable(source.getIntrospectionUri()).ifPresent(opaquetoken::setIntrospectionUri);
61+
}
62+
}
63+
return null;
64+
}
65+
66+
default Resource mapResource(String filename) {
67+
return new FileSystemResource(filename);
68+
}
69+
70+
default ActionDTO stringToActionDto(String str) {
71+
return Optional.ofNullable(str)
72+
.map(s -> Enum.valueOf(ActionDTO.class, s.toUpperCase()))
73+
.orElseThrow();
74+
}
75+
}

api/src/main/java/io/kafbat/ui/mapper/KafkaConnectMapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,19 @@
1414
import io.kafbat.ui.model.connect.InternalConnectInfo;
1515
import java.util.List;
1616
import org.mapstruct.Mapper;
17+
import org.mapstruct.Mapping;
1718

1819
@Mapper(componentModel = "spring")
1920
public interface KafkaConnectMapper {
2021
NewConnector toClient(io.kafbat.ui.model.NewConnectorDTO newConnector);
2122

23+
@Mapping(target = "status", ignore = true)
24+
@Mapping(target = "connect", ignore = true)
2225
ConnectorDTO fromClient(io.kafbat.ui.connect.model.Connector connector);
2326

2427
ConnectorStatusDTO fromClient(ConnectorStatusConnector connectorStatus);
2528

29+
@Mapping(target = "status", ignore = true)
2630
TaskDTO fromClient(ConnectorTask connectorTask);
2731

2832
TaskStatusDTO fromClient(io.kafbat.ui.connect.model.TaskStatus taskStatus);

api/src/main/java/io/kafbat/ui/model/InternalLogDirStats.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.LongSummaryStatistics;
99
import java.util.Map;
1010
import lombok.Value;
11+
import org.apache.kafka.clients.admin.LogDirDescription;
1112
import org.apache.kafka.common.TopicPartition;
1213
import org.apache.kafka.common.requests.DescribeLogDirsResponse;
1314
import reactor.util.function.Tuple2;
@@ -36,12 +37,12 @@ public static InternalLogDirStats empty() {
3637
return new InternalLogDirStats(Map.of());
3738
}
3839

39-
public InternalLogDirStats(Map<Integer, Map<String, DescribeLogDirsResponse.LogDirInfo>> log) {
40+
public InternalLogDirStats(Map<Integer, Map<String, LogDirDescription>> log) {
4041
final List<Tuple3<Integer, TopicPartition, Long>> topicPartitions =
4142
log.entrySet().stream().flatMap(b ->
4243
b.getValue().entrySet().stream().flatMap(topicMap ->
43-
topicMap.getValue().replicaInfos.entrySet().stream()
44-
.map(e -> Tuples.of(b.getKey(), e.getKey(), e.getValue().size))
44+
topicMap.getValue().replicaInfos().entrySet().stream()
45+
.map(e -> Tuples.of(b.getKey(), e.getKey(), e.getValue().size()))
4546
)
4647
).toList();
4748

api/src/main/java/io/kafbat/ui/serdes/CustomSerdeLoader.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,10 @@ private ClassLoader createClassloader(Path location) {
8787
// we assume that location's content does not change during serdes creation
8888
// so, we can reuse already created classloaders
8989
return classloaders.computeIfAbsent(location, l ->
90-
AccessController.doPrivileged(
91-
(PrivilegedAction<URLClassLoader>) () ->
92-
new ChildFirstClassloader(
93-
archives.toArray(URL[]::new),
94-
CustomSerdeLoader.class.getClassLoader())));
90+
new ChildFirstClassloader(
91+
archives.toArray(URL[]::new),
92+
CustomSerdeLoader.class.getClassLoader())
93+
);
9594
}
9695

9796
//---------------------------------------------------------------------------------

api/src/main/java/io/kafbat/ui/serdes/builtin/sr/Serialize.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ static byte[] serializeProto(SchemaRegistryClient srClient,
9696

9797
@KafkaClientInternalsDependant("AbstractKafkaAvroSerializer::serializeImpl")
9898
@SneakyThrows
99+
@SuppressWarnings("unchecked")
99100
static byte[] serializeAvro(AvroSchema schema, int schemaId, String input) {
100101
var avroObject = JsonAvroConversion.convertJsonToAvro(input, schema.rawSchema());
101102
try (var out = new ByteArrayOutputStream()) {

api/src/main/java/io/kafbat/ui/service/AdminClientServiceImpl.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import java.util.Map;
99
import java.util.Optional;
1010
import java.util.Properties;
11-
import java.util.concurrent.CompletableFuture;
1211
import java.util.concurrent.ConcurrentHashMap;
1312
import java.util.concurrent.atomic.AtomicLong;
1413
import lombok.extern.slf4j.Slf4j;

0 commit comments

Comments
 (0)