
io.github.mike10004.containment.lifecycle.DecoupledLifecycle Maven / Gradle / Ivy
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