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 params = new HashMap(); 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); } } }