package hudson.plugins.mibsr.health;
import hudson.model.HealthReport;
import hudson.model.Result;
import org.kohsuke.stapler.DataBoundConstructor;
import java.io.Serializable;
/**
* Created by IntelliJ IDEA. User: stephen Date: 17-Mar-2008 Time: 12:44:28
*/
public abstract class HealthTarget<M extends HealthMetric<OBSERVABLE>, OBSERVABLE>
implements Serializable
{
private final M metric;
private final Float healthy;
private final Float unhealthy;
private final Float unstable;
@DataBoundConstructor
public HealthTarget( M metric, String healthy, String unhealthy, String unstable )
{
this.metric = metric;
this.healthy = safeParse( healthy );
this.unhealthy = safeParse( unhealthy );
this.unstable = safeParse( unstable );
}
private static Float safeParse( String value )
{
if ( value == null )
{
return null;
}
try
{
return Float.valueOf( value );
}
catch ( NumberFormatException e )
{
return null;
}
}
public M getMetric()
{
return metric;
}
public Float getHealthy()
{
return healthy;
}
public Float getUnhealthy()
{
return unhealthy;
}
public Float getUnstable()
{
return unstable;
}
public HealthReport evaluateHealth( OBSERVABLE observable, String descriptionPrefix )
{
float result = metric.measure( observable );
float healthy = this.healthy == null ? metric.getBest() : this.healthy;
float unhealthy = this.unhealthy == null ? metric.getWorst() : this.unhealthy;
return new HealthReport(
Math.max( 0, Math.min( 100, (int) ( ( result - unhealthy ) / ( healthy - unhealthy ) * 100 ) ) ),
Messages._HealthTarget_Description(descriptionPrefix, metric.getName(), result));
}
public Result evaluateStability( OBSERVABLE observable )
{
float result = metric.measure( observable );
float healthy = this.healthy == null ? metric.getBest() : this.healthy;
float unhealthy = this.unhealthy == null ? metric.getWorst() : this.unhealthy;
if ( unstable != null )
{
if ( ( healthy > unhealthy && result < unstable ) || ( healthy < unhealthy && result > unstable ) )
{
return Result.UNSTABLE;
}
}
return Result.SUCCESS;
}
}