MinioWagon.java

package ru.volnenko.plugin.wagon;

import io.minio.MinioClient;
import io.minio.errors.ErrorResponseException;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
import lombok.SneakyThrows;
import org.apache.maven.wagon.*;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.net.URI;
import java.net.URLConnection;
import java.nio.file.*;

public class MinioWagon extends BaseWagon {

    @Getter
    @Setter
    private MinioClient minioClient;

    @Override
    @SneakyThrows
    public void fillInputData(InputData inputData) {
        try {
            inputData.setInputStream(minioClient.getObject(getMinioBucket(), getMinioPathname() + "/" + inputData.getResource().getName()));
        } catch (ErrorResponseException e) {
            if (e.errorResponse().code().equals("NoSuchKey")) {
                throw new ResourceDoesNotExistException(e.getMessage(), e);
            }
            throw new TransferFailedException(e.getMessage(), e);
        } catch (@NonNull final Exception e) {
            throw new TransferFailedException(e.getMessage(), e);
        }
    }

    @Override
    @SneakyThrows
    public void fillOutputData(OutputData outputData)  {
        outputData.setOutputStream(new ByteArrayOutputStream() {
            @Override
            @SneakyThrows
            public void close() {
                @NonNull final ByteArrayInputStream inputStream = new ByteArrayInputStream(toByteArray());
                @NonNull final String resource = outputData.getResource().getName();
                @NonNull final String objectName = getMinioPathname() + "/" + resource;
                @NonNull final String mimeType = URLConnection.guessContentTypeFromName(outputData.getResource().getName());
                minioClient.putObject(getMinioBucket(), objectName, inputStream, mimeType);
            }
        });
    }

    @Override
    @SneakyThrows
    public void closeConnection() {
        minioClient = null;
    }

    @Override
    @SneakyThrows
    protected void openConnectionInternal() {
        System.out.println("MINIO HOST NAME: " + getMinioHostname());
        System.out.println("MINIO BUCKET: " + getMinioBucket());
        minioClient = super.getMinioClient();
    }

    @Override
    @SneakyThrows
    public void putDirectory(@NonNull final File sourceDirectory, @NonNull final String destinationDirectory) {
        @NonNull final URI uri = sourceDirectory.getAbsoluteFile().toURI();
        @NonNull final DiskVisitor diskVisitor = getDiskVisitor(sourceDirectory);
        Files.walkFileTree(Paths.get(uri), diskVisitor);
    }

    @NonNull
    private DiskVisitor getDiskVisitor(@NonNull final File sourceDirectory) {
        return new DiskVisitor(getMinioPathname(), sourceDirectory, minioClient, getMinioBucket());
    }

}