All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.mike10004.containment.lifecycle.DecoupledLifecycle Maven / Gradle / Ivy

There is a newer version: 0.6
Show newest version
package io.github.mike10004.containment.lifecycle;

/**
 * Lifecycle implementation that employs delegates for commission and decommission.
 * @param  lifecycle resource type
 */
public class DecoupledLifecycle implements Lifecycle {

    private transient final Object lock = new Object();
    private final Decommissioner decommissioner;
    private final Commissioner commissioner;
    private volatile D commissioned;

    /**
     * Constructs an instance.
     * @param commissioner commissioner
     * @param decommissioner decommissioner
     */
    public DecoupledLifecycle(Commissioner commissioner, Decommissioner decommissioner) {
        this.decommissioner = decommissioner;
        this.commissioner = commissioner;
    }

    /**
     * Invokes the commissioner.
     * Stores the result for subquent decommissing.
     * @return commissioned resource
     * @throws Exception
     */
    @Override
    public D commission() throws Exception {
        synchronized (lock) {
            commissioned = commissioner.commission();
            return commissioned;
        }
    }

    /**
     * Invokes the decommissioner if and only if commission has succeeded.
     */
    @Override
    public void decommission() {
        synchronized (lock) {
            if (commissioned != null) {
                decommissioner.decommission(commissioned);
                commissioned = null;
            }
        }
    }

    /**
     * Interface of a service that commissions a resource.
     * @param  resource type
     */
    public interface Commissioner {
        /**
         * Commissions the resource.
         * @return resource
         * @throws Exception on error
         */
        R commission() throws Exception;
    }

    /**
     * Interface of a service that decommissions a resource.
     * @param  resource type
     */
    public interface Decommissioner {
        /**
         * Decommissions the resource.
         * @param resource resource
         */
        void decommission(R resource);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy