package org.elasticsearch;

import com.obs.services.ObsClient;
import org.elasticsearch.common.lease.Releasable;
import org.elasticsearch.common.util.concurrent.AbstractRefCounted;

import java.io.IOException;

/**
 * Handles the shutdown of the wrapped {@link ObsClient} using reference
 * counting
 */
public class ObsReference extends AbstractRefCounted implements Releasable {

    private final ObsClient client;

    ObsReference(ObsClient client) {
        super("HUAWEI_OBS_CLIENT");
        this.client = client;
    }

    /**
     * Call when the client is not needed anymore.
     */
    @Override
    public void close() {
        decRef();
    }

    /**
     * Returns the underlying `Huawei OBS` client. All method calls are permitted BUT
     * NOT shutdown. Shutdown is called when reference count reaches 0.
     */
    public ObsClient client() {
        return client;
    }

    @Override
    protected void closeInternal() {
        try {
            client.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

}