package net.johnewart.gearman.common.packets.request;
import net.johnewart.gearman.constants.PacketType;
import net.johnewart.gearman.constants.JobPriority;
import java.util.Arrays;
import java.util.Date;
import java.util.concurrent.atomic.AtomicReference;
public class SubmitJob extends RequestPacket {
private final AtomicReference<String> taskName, uniqueId, epochString;
private final byte[] data;
private final boolean background;
private final int size;
public SubmitJob(byte[] pktdata)
{
super(pktdata);
taskName = new AtomicReference<>();
uniqueId = new AtomicReference<>();
epochString = new AtomicReference<>();
int pOff = 0;
pOff = parseString(pOff, taskName);
pOff = parseString(pOff, uniqueId);
if (this.type == PacketType.SUBMIT_JOB_EPOCH)
{
pOff = parseString(pOff, epochString);
}
this.background = this.type == PacketType.SUBMIT_JOB_HIGH_BG ||
this.type == PacketType.SUBMIT_JOB_LOW_BG ||
this.type == PacketType.SUBMIT_JOB_BG ||
this.type == PacketType.SUBMIT_JOB_EPOCH;
data = Arrays.copyOfRange(rawdata, pOff, rawdata.length);
this.size = rawdata.length;
}
public SubmitJob(String function, String unique_id, byte[] data, boolean background)
{
this(function, unique_id, data, background,JobPriority.NORMAL);
}
public SubmitJob(String function, String unique_id, byte[] data, boolean background, JobPriority priority)
{
this(function, unique_id, data, background, priority, null);
}
public SubmitJob(String function, String uniqueID, byte[] data, Date when) {
this(function, uniqueID, data, true, JobPriority.NORMAL, when);
}
public SubmitJob(String function, String unique_id, byte[] data, boolean background, JobPriority priority, Date when) {
this.taskName = new AtomicReference<>(function);
this.uniqueId = new AtomicReference<>(unique_id);
this.epochString = new AtomicReference<>();
this.background = background;
this.data = data.clone();
switch (priority)
{
case HIGH:
this.type = background ? PacketType.SUBMIT_JOB_HIGH_BG : PacketType.SUBMIT_JOB_HIGH;
break;
case NORMAL:
this.type = background ? PacketType.SUBMIT_JOB_BG : PacketType.SUBMIT_JOB;
break;
case LOW:
this.type = background ? PacketType.SUBMIT_JOB_LOW_BG : PacketType.SUBMIT_JOB_LOW;
break;
default:
break;
}
if(when != null) {
this.epochString.set(String.valueOf(when.getTime()));
this.size = function.length() + 1 + unique_id.length() + 1 + epochString.get().length() + 1 + data.length;
} else {
this.size = function.length() + 1 + unique_id.length() + 1 + data.length;
}
}
public Date getWhen()
{
return new Date(Long.parseLong(epochString.get()));
}
public JobPriority getPriority() {
switch(this.type)
{
case SUBMIT_JOB:
case SUBMIT_JOB_BG:
case SUBMIT_JOB_EPOCH:
case SUBMIT_JOB_SCHED:
return JobPriority.NORMAL;
case SUBMIT_JOB_HIGH:
case SUBMIT_JOB_HIGH_BG:
return JobPriority.HIGH;
case SUBMIT_JOB_LOW:
case SUBMIT_JOB_LOW_BG:
return JobPriority.LOW;
}
return null;
}
public String getFunctionName()
{
return this.taskName.get();
}
public String getUniqueId()
{
return uniqueId.get();
}
public boolean isBackground() {
return background;
}
public byte[] getData() {
return data;
}
public long getEpoch()
{
return Long.parseLong(epochString.get());
}
@Override
public byte[] toByteArray()
{
byte[] metadata;
if(type == PacketType.SUBMIT_JOB_EPOCH)
{
metadata = stringsToTerminatedByteArray(taskName.get(), uniqueId.get(), epochString.get());
} else {
metadata = stringsToTerminatedByteArray(taskName.get(), uniqueId.get());
}
return concatByteArrays(getHeader(), metadata, data);
}
@Override
public int getPayloadSize()
{
return size;
}
}