storagehub/src/main/java/org/gcube/data/access/storagehub/storage/backend/impl/GcubeMinIOStorageBackendFac...

75 lines
2.4 KiB
Java

package org.gcube.data.access.storagehub.storage.backend.impl;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
import jakarta.annotation.PostConstruct;
import jakarta.inject.Singleton;
import org.gcube.common.storagehub.model.Metadata;
import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters;
import org.gcube.common.storagehub.model.items.nodes.PayloadBackend;
import org.gcube.common.storagehub.model.storages.StorageBackend;
import org.gcube.common.storagehub.model.storages.StorageBackendFactory;
@Singleton
public class GcubeMinIOStorageBackendFactory implements StorageBackendFactory {
private static final String PROP_PREFIX = "default.";
private Metadata baseParameters;
@PostConstruct
public void init(){
baseParameters = getParameters();
}
@Override
public String getName() {
return "gcube-default-minio";
}
@Override
public boolean isSystemStorage() {
return true;
}
@Override
public StorageBackend create(PayloadBackend payloadConfiguration) throws InvalidCallParameters {
if (payloadConfiguration.getParameters().isEmpty())
throw new InvalidCallParameters(getName()+": null or empty parameter not allowed");
String bucketName = (String)payloadConfiguration.getParameters().get("bucketName");
if (bucketName == null || bucketName.isBlank())
throw new InvalidCallParameters(getName()+": 'bucketName' cannot be blank or empty");
Metadata metadata = new Metadata(new HashMap<>(baseParameters.getMap()));
metadata.getMap().putAll(payloadConfiguration.getParameters());
return new S3Backend(new PayloadBackend(getName(), metadata), (String) -> UUID.randomUUID().toString());
}
private Metadata getParameters(){
try (InputStream input = GcubeMinIOStorageBackendFactory.class.getClassLoader().getResourceAsStream("storage-settings.properties")) {
Properties prop = new Properties();
prop.load(input);
Map<String, Object> params = new HashMap<String, Object>();
prop.forEach((k,v) -> { if (k.toString().startsWith(PROP_PREFIX)) params.put(k.toString().replace(PROP_PREFIX, ""), v);});
return new Metadata(params);
} catch (IOException ex) {
throw new RuntimeException("error initializing MinIO", ex);
}
}
}