package com.intrbiz.bergamot.virtual.operator;
import java.util.List;
import java.util.Set;
import com.intrbiz.bergamot.model.Status;
import com.intrbiz.bergamot.virtual.VirtualCheckExpressionContext;
import com.intrbiz.bergamot.virtual.reference.CheckReference;
public class CaseOperator extends VirtualCheckOperator
{
private static final long serialVersionUID = 1L;
private final List<CaseWhen> when;
private final Status elseStatus;
public CaseOperator(List<CaseWhen> when, Status elseStatus)
{
super();
this.when = when;
this.elseStatus = elseStatus == null ? Status.CRITICAL : elseStatus;
}
@Override
public boolean computeOk(VirtualCheckExpressionContext context)
{
return this.computeStatus(context).isOk();
}
public Status computeStatus(VirtualCheckExpressionContext context)
{
for (CaseWhen test : this.when)
{
Status status = test.apply(context);
if (status != null) return status;
}
return this.elseStatus;
}
@Override
public void computeDependencies(Set<CheckReference> checks)
{
}
public String toString()
{
StringBuilder sb = new StringBuilder("case");
for (CaseWhen cw : this.when)
{
sb.append(" ").append(cw.toString());
}
sb.append(" else ").append(this.elseStatus.toString()).append(" end");
return sb.toString();
}
public static class CaseWhen
{
private final VirtualCheckOperator value;
private final Status status;
private final Status as;
public CaseWhen(VirtualCheckOperator value, Status status, Status as)
{
this.value = value;
this.status = status;
this.as = as;
}
public VirtualCheckOperator getValue()
{
return value;
}
public Status getStatus()
{
return status;
}
public Status getAs()
{
return as;
}
public Status apply(VirtualCheckExpressionContext context)
{
return this.value.computeStatus(context) == this.status ? this.as : null;
}
public String toString()
{
return "when " + this.value.toString() + " is " + this.status.toString() + " then " + this.as;
}
}
}