package net.johnewart.gearman.common.packets.response; import net.johnewart.gearman.common.JobState; import net.johnewart.gearman.common.JobStatus; import net.johnewart.gearman.constants.PacketType; import java.util.concurrent.atomic.AtomicReference; public class StatusRes extends ResponsePacket { private final AtomicReference<String> jobHandle; private final boolean statusKnown; private final boolean running; private final int numerator; private final int denominator; public StatusRes(String jobHandle, boolean running, boolean statusKnown, int numerator, int denominator) { this.jobHandle = new AtomicReference<>(jobHandle); this.running = running; this.statusKnown = statusKnown; this.numerator = numerator; this.denominator = denominator; this.type = PacketType.STATUS_RES; } public StatusRes(byte[] pktdata) { super(pktdata); jobHandle = new AtomicReference<>(); AtomicReference<String> numeratorStr = new AtomicReference<>(); AtomicReference<String> denominatorStr = new AtomicReference<>(); AtomicReference<String> statusStr = new AtomicReference<>(); AtomicReference<String> runningStr = new AtomicReference<>(); int pOff = 0; pOff = parseString(pOff, jobHandle); pOff = parseString(pOff, statusStr); pOff = parseString(pOff, runningStr); pOff = parseString(pOff, numeratorStr); parseString(pOff, denominatorStr); if(Integer.parseInt(runningStr.get()) == 1) { running = true; } else { running = false; } if(Integer.parseInt(statusStr.get()) == 1) { statusKnown = true; } else { statusKnown = false; } denominator = Integer.parseInt(denominatorStr.get()); numerator = Integer.parseInt(numeratorStr.get()); type = PacketType.STATUS_RES; } public StatusRes(JobStatus jobStatus) { running = jobStatus.isRunning(); statusKnown = jobStatus.isStatusKnown(); denominator = jobStatus.getDenominator(); numerator = jobStatus.getNumerator(); jobHandle = new AtomicReference<>(jobStatus.getJobHandle()); type = PacketType.STATUS_RES; } public byte[] toByteArray() { int knownStatus = statusKnown ? 1 : 0; int runningStatus = running ? 1 : 0; byte[] metadata = stringsToTerminatedByteArray( false, // No final terminator jobHandle.get(), String.valueOf(knownStatus), String.valueOf(runningStatus), String.valueOf(numerator), String.valueOf(denominator) ); return concatByteArrays(getHeader(), metadata); } public String getJobHandle() { return jobHandle.get(); } public int getNumerator() { return numerator; } public int getDenominator() { return denominator; } public boolean isRunning() { return running; } public boolean isStatusKnown() { return statusKnown; } public float percentComplete() { if(denominator != 0) { return (float)numerator / (float)denominator; } else { return 0.0F; } } @Override public int getPayloadSize() { return jobHandle.get().length() + 1 + 2 + 2 + String.valueOf(numerator).length() + 1 + String.valueOf(denominator).length(); } public String toString() { return jobHandle.get() + ":" + statusKnown + ":" + running + ":" + numerator + ":" + denominator; } public JobStatus toJobStatus() { return new JobStatus( numerator, denominator, this.running ? JobState.WORKING : JobState.QUEUED, getJobHandle() ); } }