package jnpf.fileStorage;
|
|
import jakarta.annotation.PostConstruct;
|
import jakarta.annotation.PreDestroy;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.dromara.x.file.storage.core.FileStorageService;
|
import org.dromara.x.file.storage.core.platform.FileStorage;
|
import org.dromara.x.file.storage.core.platform.MinioFileStorage;
|
import org.dromara.x.file.storage.core.platform.MinioFileStorageClientFactory;
|
import org.springframework.stereotype.Component;
|
|
import java.util.ArrayList;
|
import java.util.HashSet;
|
import java.util.List;
|
import java.util.Set;
|
|
@Slf4j
|
@Component
|
@RequiredArgsConstructor
|
public class SeaweedFsStorageRegistrar {
|
private final SeaweedFsStorageProperties properties;
|
private final FileStorageService fileStorageService;
|
private final SeaweedFsBucketVerifier bucketVerifier;
|
private final List<MinioFileStorage> registeredStorages = new ArrayList<>();
|
|
@PostConstruct
|
void register() {
|
try {
|
validateEnabledConfigs();
|
for (SeaweedFsStorageProperties.SeaweedFsConfig config : properties.getSeaweedfs()) {
|
if (!Boolean.TRUE.equals(config.getEnableStorage())) {
|
continue;
|
}
|
register(config);
|
}
|
validateDefaultPlatform();
|
} catch (RuntimeException exception) {
|
unregister();
|
throw exception;
|
}
|
}
|
|
private void validateEnabledConfigs() {
|
Set<String> platforms = new HashSet<>();
|
for (SeaweedFsStorageProperties.SeaweedFsConfig config : properties.getSeaweedfs()) {
|
if (!Boolean.TRUE.equals(config.getEnableStorage())) {
|
continue;
|
}
|
validate(config);
|
if (!platforms.add(config.getPlatform())) {
|
throw new IllegalStateException("文件存储平台标识重复: " + config.getPlatform());
|
}
|
}
|
}
|
|
private void register(SeaweedFsStorageProperties.SeaweedFsConfig config) {
|
MinioFileStorageClientFactory clientFactory = new MinioFileStorageClientFactory(config);
|
MinioFileStorage storage = new MinioFileStorage(config, clientFactory);
|
try {
|
bucketVerifier.verify(storage);
|
synchronized (fileStorageService.getFileStorageList()) {
|
ensureUnique(storage.getPlatform());
|
fileStorageService.getFileStorageList().add(storage);
|
registeredStorages.add(storage);
|
}
|
log.info("SeaweedFS 存储平台已注册: platform={}, bucket={}",
|
config.getPlatform(), config.getBucketName());
|
} catch (RuntimeException exception) {
|
storage.close();
|
throw exception;
|
}
|
}
|
|
@PreDestroy
|
void unregister() {
|
for (MinioFileStorage storage : registeredStorages) {
|
fileStorageService.getFileStorageList().remove(storage);
|
storage.close();
|
}
|
registeredStorages.clear();
|
}
|
|
private void ensureUnique(String platform) {
|
for (FileStorage storage : fileStorageService.getFileStorageList()) {
|
if (platform.equals(storage.getPlatform())) {
|
throw new IllegalStateException("文件存储平台标识重复: " + platform);
|
}
|
}
|
}
|
|
private void validateDefaultPlatform() {
|
String defaultPlatform = properties.getDefaultPlatform();
|
requireText(defaultPlatform, "default-platform");
|
if (fileStorageService.getFileStorage(defaultPlatform) == null) {
|
throw new IllegalStateException("默认文件存储平台未启用或注册失败: " + defaultPlatform);
|
}
|
}
|
|
private void validate(SeaweedFsStorageProperties.SeaweedFsConfig config) {
|
requireText(config.getPlatform(), "platform");
|
if (!config.getPlatform().startsWith("seaweedfs-")) {
|
throw new IllegalStateException("SeaweedFS 平台标识必须以 seaweedfs- 开头");
|
}
|
requireText(config.getAccessKey(), "access-key");
|
requireText(config.getSecretKey(), "secret-key");
|
requireText(config.getEndPoint(), "end-point");
|
requireText(config.getBucketName(), "bucket-name");
|
}
|
|
private void requireText(String value, String field) {
|
if (value == null || value.trim().isEmpty()) {
|
throw new IllegalStateException("SeaweedFS 配置缺少 " + field);
|
}
|
}
|
}
|